将项目动态附加到 ListView

Posted

技术标签:

【中文标题】将项目动态附加到 ListView【英文标题】:Append items dynamically to ListView 【发布时间】:2018-12-22 22:10:00 【问题描述】:

我是 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】:

调用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());
  

【讨论】:

太棒了!非常感谢这个例子!像魅力一样工作 但是如果 floatingActionButton 不在 _MyListState 类之外呢?

以上是关于将项目动态附加到 ListView的主要内容,如果未能解决你的问题,请参考以下文章

Javascript动态地将函数附加到对象

动态图像附加到鼠标悬停下拉

将动态加载的 javascript 事件处理程序附加到动态加载的 HTML [重复]

如何将 DOM 元素附加到动态新添加的 DOM 元素

VS2017 不会将附加包含目录复制到远程环境(linux)导致编译错误

如何使用 Terraform 将资源动态附加到内联策略?