Flutter flatter:Checkbox onChange即使值更改也不会更新UI
我正在Flatter中构建一个To应用程序,我想通过使用复选框来更改我个人todo的布尔值。虽然该值确实发生了更改,但它不会反映在UI中。我做错什么了吗 开始时,我没有使用布尔值来更改Todo的completed属性的值。我试图用复选框更改它,但它似乎不起作用,这就是为什么我改为使用布尔值 进口“包装:颤振/材料.省道”; 导入“/todo.dart”Flutter flatter:Checkbox onChange即使值更改也不会更新UI,flutter,Flutter,我正在Flatter中构建一个To应用程序,我想通过使用复选框来更改我个人todo的布尔值。虽然该值确实发生了更改,但它不会反映在UI中。我做错什么了吗 开始时,我没有使用布尔值来更改Todo的completed属性的值。我试图用复选框更改它,但它似乎不起作用,这就是为什么我改为使用布尔值 进口“包装:颤振/材料.省道”; 导入“/todo.dart” void main() => runApp(MyApp()); class MyApp extends StatelessWidget
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'To do app',
theme: ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.green,
),
darkTheme: ThemeData(
brightness: Brightness.light,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List _myTodos = [
Todo(title: 'Take the dogs for a walk', completed: false, id: '1'),
Todo(title: 'Go out for a run', completed: true, id: '2')
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('To do app'),
centerTitle: true,
),
body: _myTodos.isEmpty
? Text(
'Press the button to add a new Todo',
style: TextStyle(fontSize: 20),
)
: Column(
children: _myTodos.map((todo) {
bool completed = todo.completed;
return Row(
children: <Widget>[
Checkbox(
value: completed,
onChanged: (bool newValue) {
print(completed);
setState(() {
completed = newValue;
print(completed);
});
},
),
Text(
todo.title,
style: TextStyle(fontSize: 16),
)
],
);
}).toList()),
floatingActionButton: FloatingActionButton(
onPressed: () {},
elevation: 8,
child: Icon(Icons.add),
),
);
}
}
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“待办应用程序”,
主题:主题数据(
亮度:亮度,亮度,
主样本:颜色。绿色,
),
黑暗主题:主题数据(
亮度:亮度,亮度,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
最终列表_myTodos=[
Todo(标题:“带狗散步”,完成:false,id:“1”),
Todo(标题:“外出跑步”,完成:true,id:“2”)
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“待办事项应用程序”),
标题:对,
),
正文:_myTodos.isEmpty
?文本(
'按按钮添加新的待办事项',
样式:TextStyle(字体大小:20),
)
:列(
子项:_myTodos.map((todo){
bool completed=todo.completed;
返回行(
儿童:[
复选框(
价值:已完成,
一旦更改:(bool newValue){
打印(已完成);
设置状态(){
完成=新值;
打印(已完成);
});
},
),
正文(
todo.title,
样式:TextStyle(字体大小:16),
)
],
);
}).toList()),
浮动操作按钮:浮动操作按钮(
按下:(){},
立面图:8,
子:图标(Icons.add),
),
);
}
}
谢谢大家的回答。我发现了我的问题所在。在我的Todo类中,我已将已完成的值设置为final,因此当我按下它时,当然无法更改它 谢谢大家的回答。我发现了我的问题所在。在我的Todo类中,我已将已完成的值设置为final,因此当我按下它时,当然无法更改它 你为什么要把它分配给一个新的布尔<代码>bool completed=todo.completed代码>尝试不分配它,只需使用value:todo.completed、
和todo.completed=newValue代码>谢谢你的评论。这是我在开始时所做的,但是我收到了以下错误消息类“Todo”没有实例设置程序“completed=”。接收者:“Todo”的实例尝试调用:completed=true
并使用CheckboxListTile
像:子项:_myTodos.map((Todo)=>CheckboxListTile(controlAffinity:listIlecontrolAffinity.leading,title:Text(Todo.title,style:TextStyle(fontSize:16)),值:Todo.completed,onChanged:(bool newValue)=>setState()=>todo.completed=newValue),).toList()
谢谢,我已经重构了我的代码:)当然,你的欢迎为什么你要把它分配给一个新的bool<代码>bool completed=todo.completed代码>尝试不分配它,只需使用value:todo.completed、
和todo.completed=newValue代码>谢谢你的评论。这是我在开始时所做的,但是我收到了以下错误消息类“Todo”没有实例设置程序“completed=”。接收者:“Todo”的实例尝试调用:completed=true
并使用CheckboxListTile
像:子项:_myTodos.map((Todo)=>CheckboxListTile(controlAffinity:listIlecontrolAffinity.leading,title:Text(Todo.title,style:TextStyle(fontSize:16)),值:Todo.completed,onChanged:(bool newValue)=>setState()=>todo.completed=newValue),).toList()
谢谢,我已经重构了我的代码:)当然,欢迎光临