1,flutter定义一个状态值,应该放在哪里合适?
1.1, flutter widget的结构
Dart
//无状态的,固定widget
class CustomPositionedWidget extends StatelessWidget {
const CustomPositionedWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return Container();
}
}
//有状态的widget
class CustomPositionedWidget extends StatefulWidget {
//状态属性写在这里???
const CustomPositionedWidget({
super.key,
});
@override
_CustomPositionedWidgetState createState() => _CustomPositionedWidgetState();
}
class _CustomPositionedWidgetState extends State<CustomPositionedWidget> {
//状态属性写在这里???
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
状态属性写在哪里合适?
Dart
enum AnswerState { unanswered, correct, incorrect }
class CustomPositionedWidget extends StatefulWidget {
//这里只是传递了初始值
final bool initialNeedShowState;
final AnswerState initialAnswerState;
const CustomPositionedWidget({
required this.initialNeedShowState,
required this.initialAnswerState,
});
@override
_CustomPositionedWidgetState createState() => _CustomPositionedWidgetState();
}
class _CustomPositionedWidgetState extends State<CustomPositionedWidget> {
//还是写在这里好,其实在这里也设置了初始值(默认值)
bool _needShowState = false;
AnswerState _answerState = AnswerState.unanswered;
@override
void initState() {
super.initState();
//设置 构造函数传递过来的初始值
_needShowState = widget.initialNeedShowState;
_answerState = widget.initialAnswerState;
}
void updateState(bool needShowState, AnswerState answerState) {
setState(() {
//如果这两个值有改变,会重新绘制widget
_needShowState = needShowState;
_answerState = answerState;
});
}
String getStr() {
if (_answerState == AnswerState.correct) {
return 'correct_image';
} else if (_answerState == AnswerState.incorrect) {
return 'incorrect_image';
} else {
return 'default_image';
}
}
@override
Widget build(BuildContext context) {
return Positioned(
right: 22.w,
top: 0,
bottom: 0,
child: Align(
alignment: Alignment.center,
child: _needShowState && (_answerState != AnswerState.unanswered)
? Image.asset(
width: 36.w,
height: 36.h,
'assets/images/${getStr()}.png',
fit: BoxFit.cover,
)
: Container(),
),
);
}
}