我是Dart和Flutter的新手,尝试在ListView中添加一个新项目。我创建了一个递增this.value
的按钮,但什么也没发生。我是否错过了UI上的更新调用?这是正确的方法吗?由于我将ListView.builder
的值直接返回给build
的调用方,因此我不确定如何获取列表以添加更多项目。非常感谢!
class MyList extends State<MyList> {
...
int value = 2;
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: this.value,
itemBuilder: (context, index) => this._buildRow(index)
);
TL;DR:调用setState
是触发UI更新的正确方式吗?
调用setState
是触发UI更新的正确方式。
来自文档:
调用setState会通知框架该对象的更改方式可能会影响用户界面在该子树中,这导致框架为本州反对。
如果您只是直接更改状态而不调用setState框架可能没有为此安排生成和用户界面子树可能不会更新以反映新状态。
这里是一个ListView
的小例子,它带有一个向其添加项目的Button
import 'package:flutter/material.dart';
void main() => runApp(new MaterialApp(home: MyList()));
class MyList extends StatefulWidget {
@override
_MyListState createState() => _MyListState();
}
class _MyListState extends State<MyList> {
int value = 2;
_addItem() {
setState(() {
value = value + 1;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text("MyApp"),
),
body: ListView.builder(
itemCount: this.value,
itemBuilder: (context, index) => this._buildRow(index)),
floatingActionButton: FloatingActionButton(
onPressed: _addItem,
child: Icon(Icons.add),
),
);
}
_buildRow(int index) {
return Text("Item " + index.toString());
}
}