我没有在 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

但屏幕上的状态并未反映这一点

您没有正确使用 StateStateful 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 并将使用传递到小部件中的任何更新值。