Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何更新ListView';谁的孩子?_Dart_Flutter - Fatal编程技术网

Dart 如何更新ListView';谁的孩子?

Dart 如何更新ListView';谁的孩子?,dart,flutter,Dart,Flutter,我的目标是能够在按下浮动操作按钮时向ListView添加“虚拟”ListTiles class Notes extends StatefulWidget{ _NotesState createState() => new _NotesState(); } class _NotesState extends State<Notes>{ List<ListTile> notes =[]; void addNewNote(){ setStat

我的目标是能够在按下浮动操作按钮时向ListView添加“虚拟”ListTiles

class Notes extends StatefulWidget{

  _NotesState createState() => new _NotesState();
}

class _NotesState extends State<Notes>{

  List<ListTile> notes =[];

  void addNewNote(){
     setState((){
        notes.add(new ListTile(title: new Text("Broccolli")));
  }

  @override
  Widget build(BuildContext context){
     return new Scaffold(
       appBar: new AppBar(title: "NOTES"),
       body: new Stack(
       children: <Widget>[
        // The notes
        new Container(
          child: new ListView(
            children: notes,
          )
        ),
        // The add notes button
        new FloatingActionButton(
          tooltip: 'Add a note',
          onPressed: addNewNote, 
        )
       ],
      ),
     );
  }
}
类注释扩展StatefulWidget{
_NotesState createState()=>new_NotesState();
}
类_NotesState扩展状态{
列表注释=[];
void addNewNote(){
设置状态(){
添加(新列表(标题:新文本(“Brockli”));
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新appBar(标题:“注释”),
正文:新堆栈(
儿童:[
//笔记
新容器(
子:新列表视图(
儿童:注意,
)
),
//“添加注释”按钮
新浮动操作按钮(
工具提示:“添加注释”,
onPressed:addNewNote,
)
],
),
);
}
}

当我按下浮动操作按钮时,新的ListTile会添加到列表中,但ListView不会得到更新。我认为我缺少/误解了一个基本概念。

最大的问题是,您直接将小部件列表作为注释的子项传递。当Flatter进行重建时,它会查看所有小部件并进行检查查看它们是否已更改;然后,它只传播已更改的城市分支的更改

因为您传递的是完全相同的列表,而Flatter喜欢以优化的方式做事情,所以它只检查ListView的子列表是否是完全相同的列表——而且因为您每次都传递相同的列表,所以它看不到区别

一种选择是,您每次都可以简单地重新创建一个新列表(通过在
新列表中包装
注释
。from(notes,growtable:false)
。但这种做法有点忽略了重点

您的小部件应该只存储创建小部件所需的信息,然后小部件的实际创建应该在
build
函数中完成

所以看起来是这样的:

class Notes extends StatefulWidget {
  _NotesState createState() => new _NotesState();
}

class _NotesState extends State<Notes> {
  List<String> notes = [];

  void addNewNote() {
    setState(() {
      notes.add("Broccolli ${notes.length}");
    });
  }

  @override
  Widget build(BuildContext context) {
    print("Notes: $notes");
    return new Scaffold(
      appBar: new AppBar(title: new Text("NOTES")),
      body: new Stack(
        children: <Widget>[
          // The notes
          new Container(
            child: new ListView(
                children: notes
                    .map((string) => new ListTile(title: new Text(string)))
                    .toList(growable: false)),
          ),
          // The add notes button
          new FloatingActionButton(
            tooltip: 'Add a note',
            onPressed: addNewNote,
          )
        ],
      ),
    );
  }
}
类注释扩展StatefulWidget{
_NotesState createState()=>new_NotesState();
}
类_NotesState扩展状态{
列表注释=[];
void addNewNote(){
设置状态(){
添加(“brocklli${notes.length}”);
});
}
@凌驾
小部件构建(构建上下文){
打印(“备注:$Notes”);
归还新脚手架(
appBar:新appBar(标题:新文本(“注释”)),
正文:新堆栈(
儿童:[
//笔记
新容器(
子:新列表视图(
儿童:注释
.map((字符串)=>new ListTile(标题:new Text(字符串)))
.toList(可增长:false)),
),
//“添加注释”按钮
新浮动操作按钮(
工具提示:“添加注释”,
onPressed:addNewNote,
)
],
),
);
}
}

直接存储listTiles确实有效,但如果您开始使用更复杂的小部件(特别是有状态的小部件),则很可能不会有效.

最大的问题是,您直接将小部件列表作为Notes的子部件传递。当Flatter进行重建时,它会查看所有小部件并检查它们是否已更改;然后只传播已更改的更改

因为您传递的是完全相同的列表,而Flatter喜欢以优化的方式做事情,所以它只检查ListView的子列表是否是完全相同的列表——而且因为您每次都传递相同的列表,所以它看不到区别

一种选择是,您每次都可以简单地重新创建一个新列表(通过在
新列表中包装
注释
。from(notes,growtable:false)
。但这种做法有点忽略了重点

您的小部件应该只存储创建小部件所需的信息,然后小部件的实际创建应该在
build
函数中完成

所以看起来是这样的:

class Notes extends StatefulWidget {
  _NotesState createState() => new _NotesState();
}

class _NotesState extends State<Notes> {
  List<String> notes = [];

  void addNewNote() {
    setState(() {
      notes.add("Broccolli ${notes.length}");
    });
  }

  @override
  Widget build(BuildContext context) {
    print("Notes: $notes");
    return new Scaffold(
      appBar: new AppBar(title: new Text("NOTES")),
      body: new Stack(
        children: <Widget>[
          // The notes
          new Container(
            child: new ListView(
                children: notes
                    .map((string) => new ListTile(title: new Text(string)))
                    .toList(growable: false)),
          ),
          // The add notes button
          new FloatingActionButton(
            tooltip: 'Add a note',
            onPressed: addNewNote,
          )
        ],
      ),
    );
  }
}
类注释扩展StatefulWidget{
_NotesState createState()=>new_NotesState();
}
类_NotesState扩展状态{
列表注释=[];
void addNewNote(){
设置状态(){
添加(“brocklli${notes.length}”);
});
}
@凌驾
小部件构建(构建上下文){
打印(“备注:$Notes”);
归还新脚手架(
appBar:新appBar(标题:新文本(“注释”)),
正文:新堆栈(
儿童:[
//笔记
新容器(
子:新列表视图(
儿童:注释
.map((字符串)=>new ListTile(标题:new Text(字符串)))
.toList(可增长:false)),
),
//“添加注释”按钮
新浮动操作按钮(
工具提示:“添加注释”,
onPressed:addNewNote,
)
],
),
);
}
}
直接存储listTiles确实有效,但如果您开始使用更复杂的小部件(特别是有状态的小部件),则很可能不会