내용을 정리하면서 익혀보자!
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatelessWidget {
var switchValue = false;
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
darkTheme: ThemeData.light(),
home: Scaffold(
body: Center(
child: Switch(
value: switchValue,
onChanged: (value) {
switchValue = value;
},
)
)
)
);
}
}
현재 StatelessWidget을 상속받은 MyApp 클래스에서 Scaffold를 이용해 스위치를 구성했다.
이 스위치는 사용자가 누를 때마다 true나 false값이 switchValue값으로 들어가 스위치 상태가 변한다.
그런데 실행된 앱에서 스위치를 눌러도 변화가 없다.
MyApp 클래스는 StatelessWidget을 상속받아 만들었으므로 위젯의 상태 변경에 따른 값을 화면에 반영하지 못하기 때문이다.
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatefulWidget {
State<StatefulWidget> createState(){
return _MyApp();
}
}
class _MyApp extends State<MyApp>{
var switchValue = false;
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
darkTheme: ThemeData.light(),
home: Scaffold(
body: Center(
child: Switch(
value: switchValue,
onChanged: (value) {
print(value);
switchValue = value;
},
)
)
)
);
}
}
코드해석
_(언더 스코어)는 내부에서만 사용할 수 있다는 것을 의미한다. _MyApp 클래스는 main.dart 안에서만 사용하므로 언더스코어를 넣는다.
child: Switch(
value: switchValue,
onChanged: (value) {
setState(() {
print(value);
switchValue = value;
});
}),
해결이 되었다.
이처럼 화면의 값을 바꾸려면 setState() 함수 안에서 해야 한다. 그래야만 바뀐 값이 반영된 화면으로 갱신한다.
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatefulWidget {
State<StatefulWidget> createState(){
return _MyApp();
}
}
class _MyApp extends State<MyApp>{
var switchValue = false;
String test = 'hello';
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
darkTheme: ThemeData.light(),
home: Scaffold(
body: Center(
child: RaisedButton(
child: Text('$test'),
onPressed: () {},
)
)
)
);
}
}
child: RaisedButton(
child: Text('$test'),
onPressed: () {
if(test == 'hello'){
setState(() {
test = 'flutter';
});
}else {
setState(() {
test = 'hello';
});
}
})
위의 코드를 추가하면 아래와 같이 버튼을 클릭하면 text가 바뀐다.
Color _color = Colors.blue;
body: Center(
child: RaisedButton(
child: Text('$test'),
color: _color,
onPressed: () {
if(_color == Colors.blue){
setState(() {
test = 'flutter';
_color = Colors.amber;
});
}else {
setState(() {
test = 'hello';
_color = Colors.blue;
});
}
},
)
)