动态将项目追加到ListView

时间:2018-07-14 21:36:33

标签: mobile dart flutter mobile-development

我是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更新的正确方法吗?

1 个答案:

答案 0 :(得分:1)

调用setState是触发UI更新的正确方法。

来自docs

  

调用setState会通知框架内部状态   该对象的更改方式可能会影响用户界面   在此子树中,这将导致框架为   这个State对象。

     

如果您仅直接更改状态而不调用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());
  }
}