我试图使用提升状态为我的复选框,我知道通过改变我的TaskTile到一个有状态的小部件生病能够解决我的问题,但我想知道为什么我的复选框不更新时,我通过setstate作为回调从一个有状态的小部件。我很抱歉,如果这个问题是愚蠢的,我刚刚开始与Flutter所以任何帮助是感激的。
这是我的无状态小部件,它在磁贴中构建复选框
import 'package:flutter/material.dart';
class TaskTile extends StatelessWidget {
final String title;
final bool isChecked;
final void Function(bool?) checkboxCallback;
TaskTile({required this.title,required this.isChecked,required this.checkboxCallback});
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(title,style: TextStyle(decoration: isChecked?TextDecoration.lineThrough:null),),
trailing: Checkbox(
value: isChecked,
onChanged: checkboxCallback,
),
);
}
}
这是一个有状态的小部件,我在这里给出回调
import 'package:flutter/material.dart';
import 'task_tile.dart';
import 'task.dart';
class TaskList extends StatefulWidget {
@override
_TaskListState createState() => _TaskListState();
}
class _TaskListState extends State<TaskList> {
@override
Widget build(BuildContext context) {
bool isChecked = false;
List<Task> tasks = [
Task(title: 'Buy Milk', isDone: isChecked),
Task(title: 'Buy Bread', isDone: isChecked),
Task(title: 'Buy Eggs', isDone: isChecked),
];
return ListView.builder(itemBuilder: (context, index) {
return TaskTile(title: tasks[index].title,isChecked: tasks[index].isDone,checkboxCallback: (checkboxState){
setState(() {
tasks[index].toggleIsDone();
});
},);
},itemCount: tasks.length,);
}
}
这也是任务类,我给切换功能改变状态
class Task{
final String title;
bool isDone;
Task({required this.title,required this.isDone});
void toggleIsDone(){
isDone = !isDone;
}
}
6条答案
按热度按时间sycxhyv71#
您没有调用该函数。而不是
你能试试吗
uyto3xhc2#
您需要使
TaskTile
有状态。TaskList
可以是StatelessWidget
。答案如下:
nom7f22z3#
对于任何
dynamic
更改,您的widget class
需要是stateful
,如果您使用的是vscode
,则可以轻松地从无状态更改为statful
。首先悬停到你的statless
小部件,然后你会得到一个灯泡一样的指示灯,按下它,然后你会得到一个改变状态的选项。g6baxovj4#
根据我的理解,您正在尝试更改列表中Task对象的状态(isChanged)。这个列表反过来用于listview builder中。由于flutter处理的是不可变的数据,并且您将列表的引用发送到listview构建器,因此列表中元素的更改不会反映在UI中,即使您使用了setState函数。相反,尝试创建一个与更新元素同名的新列表。这肯定会奏效的。
我的想法来自这个解决方案-https://stackoverflow.com/a/61847327/11844877
PS我是一个新手,不介意我的回答是没有帮助的。
ui7jx7zq5#
这是从下面的链接的解决方案:
https://codeutility.org/why-is-my-checkbox-not-updating-when-i-pass-a-callback-from-a-stateful-widget-to-stateless-widget/
uz75evzq6#
tasks_tile.dart文件:
tasks_list.dart文件:
这里是解决方案,为我工作,增加布尔?在括号的final Function(bool?)checkboxCallback;'并在tasks_list.dart文件中的checkboxCallback中添加'checkboxCallback:(bool?checkBoxState){},.