我的目标是拥有ListTiles列表,以便跟踪,能够添加/删除稍后可以在ListView中显示的项目。这是我的代码的简化版本:
class Notes extends StatefulWidget{
List<ListTile> notes;
_NotesState createState() => new _NotesState();
}
class _NotesState extends State<Notes>{
@override
Widget build(BuildContext context){
widget.notes.add(new ListTile(title: new Text("Title")));
return new ListView(
children: <ListTile>[
notes[0],
]
);
}
}
但我收到以下内容:
NoSuchMethodError:方法'add在null上调用。 接收者:null 尝试调用:添加(实例'ListTile')
我认为应该可以这样做,虽然我当然可能会弄错。提前感谢您帮助我解决我可能存在的愚蠢问题。
答案 0 :(得分:3)
问题有两个:1)您的备注字段可能未初始化。 2)您正在State
对象之外存储状态。相反,将笔记放在状态对象中并初始化成员,如下所示:
class _NotesState extends State<Notes>{
List<ListTile> notes = [
new ListTile(title: new Text("Title")),
];
@override
Widget build(BuildContext context){
return new ListView(
children: <ListTile>[
notes[0],
]
);
}
}
这样的可变数据需要在State
中的原因是窗口小部件本身可能会重建几十次,删除所有笔记。
例如,如果您的窗口小部件是动画的子窗口,它将每秒重建60次。这也意味着你根本不应该在构建方法中改变数据,因为它可能会被你更频繁地调用。