【问题标题】:Am not rebuilding objects on build() call我没有在 build() 调用上重建对象
【发布时间】:2018-04-03 16:20:11
【问题描述】:

尽管颤振调用了构建(并打印了正确的信息,如下所示),但它似乎没有构建新的 TaskWidget(未调用 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;
  }
}

打印出来:

建筑
I/flutter (28783):每日回归
I/flutter (28783): // 正确,未删除的任务

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

【问题讨论】:

    标签: dart flutter setstate


    【解决方案1】:

    您没有正确使用StateStateful Widget

    它在 Flutter 中的工作原理是 Widget 可以创建多次,但很可能只有一个 State 实例与之配合。

    有一个状态的构造函数有点反模式。

    相反,您应该这样做:

    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 更改时,您的状态将被重新构建,并将使用传递给小部件的任何更新值。

    【讨论】:

    • 我建议您一直关注this tutorial(实际上是在执行每个步骤),因为它将向您展示如何正确处理小部件、状态、有状态小部件等。
    • 谢谢!我会试一试并报告:)
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多