Flutter flatter:Checkbox onChange即使值更改也不会更新UI

Flutter flatter:Checkbox onChange即使值更改也不会更新UI,flutter,Flutter,我正在Flatter中构建一个To应用程序,我想通过使用复选框来更改我个人todo的布尔值。虽然该值确实发生了更改,但它不会反映在UI中。我做错什么了吗 开始时,我没有使用布尔值来更改Todo的completed属性的值。我试图用复选框更改它,但它似乎不起作用,这就是为什么我改为使用布尔值 进口“包装:颤振/材料.省道”; 导入“/todo.dart” void main() => runApp(MyApp()); class MyApp extends StatelessWidget

我正在Flatter中构建一个To应用程序,我想通过使用复选框来更改我个人todo的布尔值。虽然该值确实发生了更改,但它不会反映在UI中。我做错什么了吗

开始时,我没有使用布尔值来更改Todo的completed属性的值。我试图用复选框更改它,但它似乎不起作用,这就是为什么我改为使用布尔值

进口“包装:颤振/材料.省道”; 导入“/todo.dart”

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()
谢谢,我已经重构了我的代码:)当然,欢迎光临