Flutter 如何在flatter中以StatefulWidget的状态初始化字段?
我有类似这样的东西,小部件的颜色取决于bool,当你点击小部件时bool会翻转。但是我还想初始化bool,这对于小部件的不同实例是不同的。我尝试过这样的方法,其中StatefulWidget类包含初始值initBool,它在initState中用于设置myBool 这似乎有效,但老实说,我不确定,因为我得到了一个奇怪的错误,但我不知道它是否相关,但它只是觉得有点笨重,所以我想知道是否有一个更合适的方式来做这在颤振。谢谢Flutter 如何在flatter中以StatefulWidget的状态初始化字段?,flutter,dart,Flutter,Dart,我有类似这样的东西,小部件的颜色取决于bool,当你点击小部件时bool会翻转。但是我还想初始化bool,这对于小部件的不同实例是不同的。我尝试过这样的方法,其中StatefulWidget类包含初始值initBool,它在initState中用于设置myBool 这似乎有效,但老实说,我不确定,因为我得到了一个奇怪的错误,但我不知道它是否相关,但它只是觉得有点笨重,所以我想知道是否有一个更合适的方式来做这在颤振。谢谢 class MyBox extends StatefulWidget {
class MyBox extends StatefulWidget {
final bool initBool;
MyBox(this.initBool);
@override
_MyBoxState createState() => _MyBoxState();
}
class _MyBoxState extends State<MyBox> {
bool myBool;
@override
void initState() {
super.initState();
myBool = widget.initBool;
}
@override
Widget build(BuildContext context) {
return InkWell(
child: Container(
color: myBool ? Colors.green : Colors.red
),
onTap: () {
setState(() {
myBool = !myBool;
});
},
);
}
}
这是WidgetsBinding的完美案例 在super.initState;之后执行此操作:
这是允许您在init之后直接设置状态的地方。您当前的状态有什么问题?@christophermore只为初始值设置一个单独的变量感觉有点粗略,因此,我想与更有经验的Flatter用户核实一下,看看在使用StatefulWidget时,是否有一种基于最佳实践的更好方法。您目前拥有的是非常好的。请对此答案添加一些解释。不清楚。是的,但我相信我有MyBoxthis.initBool;所以我在实例化MyBox时设置了initBool,它不会为null。@tensixes initBool肯定会为null,除非您使用null-safe-dart。但是,只要你确保你通过了一些东西,那就不是问题。请回答我对您的问题的评论。MyBoxthis.initBool;到MyBox{this.initBool}@瓦利坎:为什么你认为应该改变?
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyBox(initBool: true,),
),
),
);
}
}
class MyBox extends StatefulWidget {
final bool initBool;
MyBox({this.initBool});
@override
_MyBoxState createState() => _MyBoxState();
}
class _MyBoxState extends State<MyBox> {
bool myBool;
@override
void initState() {
super.initState();
myBool = widget.initBool;
}
@override
Widget build(BuildContext context) {
return InkWell(
child: Container(
color: myBool ? Colors.green : Colors.red
),
onTap: () {
setState(() {
myBool = !myBool;
});
},
);
}
}
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
myBool = widget.initBool;
});
});