我没有在 build() 调用上重建对象
Am not rebuilding objects on build() call
尽管 flutter 调用了构建(并打印了如下正确的信息),但它似乎并没有构建新的 TaskWidgets(未调用 TaskWidgetState 的构造函数中的打印)。这会在我的应用程序中产生一些异常行为(例如,已删除的 ListView 项目的持久性)。
我有以下代码:
class TaskWidget extends StatefulWidget {
TaskWidget({this.task, this.callToSave, this.callToDelete});
final Task task;
final Function callToSave;
final Function callToDelete;
@override
State<StatefulWidget> createState() {
return new TaskWidgetState(task, callToSave, callToDelete);
}
}
class TaskWidgetState extends State<TaskWidget>{
Task task;
Function toCallOnChange;
Function callToDelete;
TaskWidgetState(Task task, Function callToSave, Function callToDelete){
print("I'm a task widget for " + task.serialise().toString());
this.task = task;
toCallOnChange = callToSave;
this.callToDelete = callToDelete;
}
}
和
class ToDoListWidget extends State<ToDoList>{
List<Task> _toDo = new List<Task>();
...
@override
Widget build(BuildContext context) {
print("building");
return new Scaffold(
body: new ListView(
children: <Widget> [
generateCard(),
...
]
),
);
}
Widget generateCard() {
return new Card(
child: new Column (
children: generateWidgets()
),
...
);
}
List<Widget> generateWidgets() {
print("generating Widgets");
List<Task> tasks = getTasks();
List<Widget> widgets = new List<Widget>();
print("I have " + tasks.length.toString() + " widgets to build");
for(Task t in tasks) {
print(t.title);
TaskWidget widget = new TaskWidget(task: t, callToSave: saveList, callToDelete: deleteTask,);
widgets.add(widget);
}
return widgets;
}
}
打印出来:
building
I/flutter (28783): Returning for Daily
I/flutter (28783): // correct, undeleted task
但屏幕上的状态并未反映这一点
您没有正确使用 State
和 Stateful Widget
。
它在 flutter 中的工作原理是 Widget 可以创建多次,但很可能只有一个 State
实例与之一起使用。
有一个状态的构造函数有点anti-pattern。
相反,您应该这样做:
class TaskWidget extends StatefulWidget {
TaskWidget({this.task, this.callToSave, this.callToDelete});
final Task task;
final Function callToSave;
final Function callToDelete;
@override
State<StatefulWidget> createState() => new TaskWidgetState();
}
class TaskWidgetState extends State<TaskWidget>{
Widget build(Context context) {
// you can just use the widget.task, this is to illustrate.
var task = widget.task;
var callToSave = widget.callToSave;
var callToDelete = widget.calltoDelete;
}
}
这样,当 widget
发生变化时,您的状态将为 re-built 并将使用传递到小部件中的任何更新值。
尽管 flutter 调用了构建(并打印了如下正确的信息),但它似乎并没有构建新的 TaskWidgets(未调用 TaskWidgetState 的构造函数中的打印)。这会在我的应用程序中产生一些异常行为(例如,已删除的 ListView 项目的持久性)。
我有以下代码:
class TaskWidget extends StatefulWidget {
TaskWidget({this.task, this.callToSave, this.callToDelete});
final Task task;
final Function callToSave;
final Function callToDelete;
@override
State<StatefulWidget> createState() {
return new TaskWidgetState(task, callToSave, callToDelete);
}
}
class TaskWidgetState extends State<TaskWidget>{
Task task;
Function toCallOnChange;
Function callToDelete;
TaskWidgetState(Task task, Function callToSave, Function callToDelete){
print("I'm a task widget for " + task.serialise().toString());
this.task = task;
toCallOnChange = callToSave;
this.callToDelete = callToDelete;
}
}
和
class ToDoListWidget extends State<ToDoList>{
List<Task> _toDo = new List<Task>();
...
@override
Widget build(BuildContext context) {
print("building");
return new Scaffold(
body: new ListView(
children: <Widget> [
generateCard(),
...
]
),
);
}
Widget generateCard() {
return new Card(
child: new Column (
children: generateWidgets()
),
...
);
}
List<Widget> generateWidgets() {
print("generating Widgets");
List<Task> tasks = getTasks();
List<Widget> widgets = new List<Widget>();
print("I have " + tasks.length.toString() + " widgets to build");
for(Task t in tasks) {
print(t.title);
TaskWidget widget = new TaskWidget(task: t, callToSave: saveList, callToDelete: deleteTask,);
widgets.add(widget);
}
return widgets;
}
}
打印出来:
building
I/flutter (28783): Returning for Daily
I/flutter (28783): // correct, undeleted task
但屏幕上的状态并未反映这一点
您没有正确使用 State
和 Stateful Widget
。
它在 flutter 中的工作原理是 Widget 可以创建多次,但很可能只有一个 State
实例与之一起使用。
有一个状态的构造函数有点anti-pattern。
相反,您应该这样做:
class TaskWidget extends StatefulWidget {
TaskWidget({this.task, this.callToSave, this.callToDelete});
final Task task;
final Function callToSave;
final Function callToDelete;
@override
State<StatefulWidget> createState() => new TaskWidgetState();
}
class TaskWidgetState extends State<TaskWidget>{
Widget build(Context context) {
// you can just use the widget.task, this is to illustrate.
var task = widget.task;
var callToSave = widget.callToSave;
var callToDelete = widget.calltoDelete;
}
}
这样,当 widget
发生变化时,您的状态将为 re-built 并将使用传递到小部件中的任何更新值。