【问题标题】:ListView Builder Only static members can be accessed in initializersListView Builder 在初始化器中只能访问静态成员
【发布时间】:2020-05-29 18:45:49
【问题描述】:

嗨,我是 Flutter 的新手

我使用 ListView.Builder 来做这样的事情:

我使用两个小部件,一个用于地址信息,一个用于将新地址项添加到 ListView

我使用回调通知添加 IconButton 被按下但我收到错误:只有静态成员可以在初始化程序中访问。当我调用 addItemToList() 方法时

这是代码:

class TestPage2 extends StatefulWidget {
  @override
  _TestPage2State createState() => _TestPage2State();
}

class _TestPage2State extends State<TestPage2> {
  List<Widget> lwidgets = [
    _Adresses(),
    _HorizontalDivider(),
    _AddElement(() {
      addItemToList();
    })
  ];

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adresses());
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts'),
      ),
      backgroundColor: Color(0xFFE5E5EA),
      body: Column(
        children: <Widget>[
          Text('ADRESS'),
          Container(
            height: 200,
            child: ListView.builder(
              itemCount: lwidgets.length,
              itemBuilder: (BuildContext context, int index) {
                return (lwidgets[index]);
              },
              physics: NeverScrollableScrollPhysics(),
            ),
          ),
        ],
      ),
    );
  }
}

这是 _AddElement 小部件:

class _AddElement extends StatelessWidget {
  final Function() onAddItem;

  const _AddElement(this.onAddItem);

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 40,
      color: Colors.white,
      child: Row(
        children: <Widget>[
          Container(
            height: 40,
            color: Colors.white,
            child: IconButton(
              icon: Icon(Icons.add_circle),
              iconSize: 24,
              color: Color(0xFF34C759),
              onPressed: () {
                onAddItem();
              },
            ),
          ),
        ],
      ),
    );
  }
}

我希望当我点击绿色按钮时,一个新项目将被添加到 ListView 中,如下所示:

我将不胜感激。

何塞·罗德里格斯

【问题讨论】:

  • 您不能调用setState,因为在创建列表时视图根本没有呈现。
  • 谢谢@SanjaySharma,有什么建议吗?一些我可以开始调查的网址?
  • 您可以创建一个插入列表的循环,您还可以返回可以在构建中调用的小部件列表

标签: flutter flutter-listview


【解决方案1】:

我根据您的代码做了一些修改。您没有包含其他小部件,例如 _Address,所以我添加了一个简单的小部件用于演示

您可以在列表视图构建器上执行 if 语句来检查它是否是最后一个索引,而不是将您的 addelement 小部件附加到列表中。在最后一个索引上,返回一个由 _Address 和 addelement 小部件组成的 Column。 参考附图和代码。

如果这有帮助,请告诉我

     List<Widget lwidgets = [_Address()]

      void addItemToList() {
        setState(() {
          lwidgets.add(_Address());
        });
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Contacts'),
          ),
          backgroundColor: Color(0xFFE5E5EA),
          body: Container(child: Column(
            children: <Widget>[
              Text('ADDRESS'),
              Container(
                height: 200,
                child: ListView.builder(
                  // separatorBuilder: (context, index) => Divider(
                  //   indent: 0,
                  //   endIndent: 0,


                  // ),
                  itemCount: lwidgets.length,
                  itemBuilder: (BuildContext context, int index) {
                    //If its the last index of the lwidget list, append _AddElement under the _addresswidget
                    return index == lwidgets.length - 1
                        ? Column(
                            children: <Widget>[
                              _Address(),
                              _AddElement(addItemToList),
                            ],
                          )
                        : _Address();
                  },
                  physics: NeverScrollableScrollPhysics(),
                ),
              ),
            ],
          ),)
        );
      }
    }

    class _AddElement extends StatelessWidget {
      final Function() onAddItem;

      const _AddElement(this.onAddItem);

      @override
      Widget build(BuildContext context) {
        return Container(
          height: 40,
          color: Colors.white,
          child: Row(
            children: <Widget>[
              Container(
                height: 40,
                color: Colors.white,
                child: IconButton(
                  icon: Icon(Icons.add_circle),
                  iconSize: 24,
                  color: Color(0xFF34C759),
                  onPressed: () {
                    onAddItem();
                  },
                ),
              ),
            ],
          ),
        );
      }
    }

    class _Address extends StatelessWidget {
      const _Address();

      @override
      Widget build(BuildContext context) {
        return Container(
          height: 40,
          color: Colors.white,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Icon(Icons.delete),
              Text('Street Name'),
              Text("postal code"),
            ],
          ),
        );
      }
    }

Initiate phase

1 item added

More Item added

【讨论】:

  • 您好,我已经尝试过您的解决方案,并且行为完全符合预期。太感谢了!我只有一个疑问,这样总会有一个项目在列表之外。将来我打算放一个保存按钮,通过列表来获取联系人条目。抱歉问得太多了,我是颤振的新手。只是为了记录,我发现另一个解决方案是:我使用 initState 将 _AddElement 小部件添加到 List,我也将作为答案。非常感谢您的意见
  • 我建议不要将保存按钮包含在列表视图中。而是使用保存按钮创建一个嵌套列表视图的列。这将使它更易于管理。此外,flutter 带有 listview.seperated 小部件,它在 listview 构建器中内置了一个分隔符,以防你想放弃你拥有的水平分隔符
  • 嗨,如果答案有帮助的话。请将其标记为答案。谢谢
【解决方案2】:

这是另一种方法:

我只将一个 _Adress 小部件放入 lwidgets 并使用 initState 放入 AddElement 小部件

之前

List<Widget> lwidgets = [
    _Adresses(),
    _HorizontalDivider(),
    _AddElement(() {
      addItemToList();
    })
  ];

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adresses());
    });
  }

之后

 List<Widget> lwidgets = [
    _Adress(),
  ];

  @override
  void initState() {
    lwidgets.insert(lwidgets.length, _AddElement(() => {addItemToList()}));
    super.initState();
  }

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adress());
    });
  }

我将 _Horizo​​ntalDivider() 放入 _Adress 小部件

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2020-08-05
    • 2020-01-05
    • 2019-01-23
    • 2018-11-13
    • 1970-01-01
    • 2020-08-31
    • 2020-02-09
    相关资源
    最近更新 更多