var 변수 = customWidget();
다만, 위와같이 설정한다면 var의 변수에 들어갈 수 있는 타입은 customWidget에 한하기 때문에 의미가 없다.
그래서 우리가 의도한 대로 customWidget만들 담을 수 있는 변수를 만드려면 var => Widget 타입을 넣어주면 된다.
class _QuizState extends State<Quiz> {
Widget activeScreen = const StartScreen(swichScreen);
void swichScreen() {
setState(
() {
activeScreen = const QuestionsScreen();
},
);
}
Widget build(context) {
return MaterialApp(
home: Scaffold(
body: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [
Color.fromARGB(255, 214, 91, 235),
Color.fromARGB(255, 240, 113, 155),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: activeScreen,
),
),
);
}
}
이때 setState를 통하여 return값 안에있는 ui들이 재평가된 후 ui에 반영할 수 있도록 작성하였고 child argument에 activescreen이라는 Widget만을 반환하는 함수를 넣어 조건부로 렌더링 하도록 작성한 코드이다.
하지만 아직 해당 메서드가 button에 연결이 안 되어있다. 이제 lift state up을 통하여 prop을 옮겨보자.
class StartScreen extends StatelessWidget {
const StartScreen(void Function() startQuiz, {super.key});
...
이때 return type과 인수를 맞춰줘야한다.
현재 상황에서는 return 값이 없으니 void라고 명시하고
추가적으로 만약 swichScreen에 인수가 있다면 Function() 안에 추가해줘야한다.
즉, 우리는 startQuiz라는 함수를 Function()으로 pointer를 얻은 것이다.
props으로 내려받았다고 생각하면 편함
또한 생성자함수와 메서드는 엄연히 다른 영역이기에 이를 연결해줄 속성값도 명시해줘야한다.
class StartScreen extends StatelessWidget {
const StartScreen(this.startQuiz, {super.key});
final void Function() startQuiz;
...
즉, class가 인스턴스화되고 속성값(변수)들이 선언되고, 함수들이 선언되는 시간이 동일하기 때문에 pointing 하는 함수들을 참조하지 못한다는 것이다.
class _QuizState extends State<Quiz> {
Widget? activeScreen;
void initState() {
activeScreen = StartScreen(swichScreen);
super.initState();
}
void swichScreen() {
setState(
() {
activeScreen = const QuestionsScreen();
},
);
}
?
를 붙여줘야한다.initState(): 플러터에 의해 실행되며 StatefulWidget의 2번째 클래스의 super classdls State 객체가 생성될 때 실행된다.
build(): Widget이 처음 build
함수가 실행될 때, setState
에 의하여 실행될 때
dispose(): Widget이 삭제되기 전에 실행. => contionally 렌더링 된다든지 할 때
class _QuizState extends State<Quiz> {
var activeScreen = 'start-screen';
void swichScreen() {
setState(() {
activeScreen = 'questions-screen';
});
}
Widget build(context) {
return MaterialApp(
home: Scaffold(
body: Container(
...
),
child: activeScreen == 'start-screen'
? StartScreen(swichScreen)
: const QuestionsScreen(),
),
),
);
}
}
build(context) {
Widget screenWidget = StartScreen(swichScreen);
if( activeScreen == 'questions-screen' ){
screenWidget = const QuestionsScreen();
}
return MaterialApp(
home: Scaffold(
body: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [
Color.fromARGB(255, 214, 91, 235),
Color.fromARGB(255, 240, 113, 155),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: screenWidget,
),
),
);
}
Widget
final myList = [
1, 2,
if(condition)
3
else
4
];
이때 condition은 당연 var혹은 어떠한 로직에 의하여 반환값이 true, false여야한다.
또한 위와같이 condition으로 작성하게 될 경우 {}
사용하지 않는다.
왜냐하면 statement body가 들어가게된다면 해당 if문은 오직 다음 1줄만 실행하기 때문이다.
final myList = [
1, 2,
condition ? 3 : 4
];