【问题标题】:ListView does not refresh whereas attached list does (Flutter)ListView 不会刷新,而附加列表会刷新 (Flutter)
【发布时间】:2019-01-19 15:48:46
【问题描述】:

我正在尝试熟悉颤振,但我遇到了一些奇怪的情况。我想构建一个动态ListView,其中+ 按钮允许添加元素。我写了以下状态代码:

class MyWidgetListState extends State<MyWidgetList> {
  List<Widget> _objectList = <Widget>[
    new Text('test'),
    new Text('test')
  ];

  void _addOne() {
    setState(() {
      _objectList.add(new Text('test'));
    });
  }

  void _removeOne() {
    setState(() {
      _objectList.removeLast();
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new ListView(
          shrinkWrap: true,
          children: _objectList
        ),
        new Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new IconButton(
              icon: new Icon(Icons.remove_circle),
              iconSize: 36.0,
              tooltip: 'Remove',
              onPressed: _objectList.length > 2 ? _removeOne : null,
            ),
            new IconButton(
              icon: new Icon(Icons.add_circle),
              iconSize: 36.0,
              tooltip: 'Add',
              onPressed: _addOne,
            )
          ],
        ),
        new Text(_objectList.length.toString())
      ],
    );
  }
}

我的问题是 ListView 在视觉上被我初始化它的 2 个元素卡住了。

在内部,_objectList 管理良好。出于测试目的,我在底部添加了一个简单的Text 小部件,用于显示列表的大小。当我单击“添加/删除”按钮并正确刷新时,这个工作正常。我错过了什么吗?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    Flutter 基于不可变数据。这意味着如果对对象的引用没有改变,那么内容也不会改变。

    问题是,在您的情况下,您总是向ListView 发送相同的数组,而是改变其内容。但这会导致ListView 假设列表没有更改,因此会阻止无用的渲染。

    您可以更改您的 setState 以记住这一点:

    setState(() {
      _objectList = List.from(_objectList)
        ..add(Text("foo"));
    });
    

    【讨论】:

    • 感谢您的帮助和解释,现在可以正常使用了。
    • 我正在实现分页,所以我将一堆文档添加到列表中。在 setstate() 内部,posts = List.from(posts) ..addAll(snapshot.documents.map((doc) { Post.fromDocument(doc); }).toList());这是我的代码 sn-p,但它似乎对我不起作用。我不知道出了什么问题。请帮忙。对于看起来很奇怪的代码 sn-p 感到抱歉。
    【解决方案2】:

    另一种解决方案!!

    ListView 替换为ListView.builder

    代码:

        ListView.builder(
                itemBuilder: (ctx, item) {
                  return _objectList[item];
                },
                shrinkWrap: true,
                itemCount: _objectList.length,
              ),
    

    输出:

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 2020-03-14
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多