【问题标题】:Reload listview.builder inside a widget from parent page从父页面重新加载小部件内的 listview.builder
【发布时间】:2020-08-20 22:08:48
【问题描述】:

我在 5 个月前开始为我的学校项目开发 Flutter,但我遇到了一个问题。

我制作了一个使用Listview.builder() 的自定义Widget 让我们调用这个myList 小部件,它在parentPage 中调用,然后,我将一个新项目添加到我的数据库从 myList 然后 setState()parentPage 我正在从数据库中加载我的项目,parentPage 正在重新加载但是 myList 和它的项目不是。 parentPagemyList 都是有状态的。

我的问题是如何才能第二次构建(或初始化?)myList,以便显示添加的项目。

我看到了类似的问题,但我不明白如何将答案应用于listview.builder()

对不起,我不能放任何我因合同而不允许使用的代码。

【问题讨论】:

    标签: listview flutter dart widget stateful


    【解决方案1】:

    您想从父小部件调用子小部件的方法,这可以使用全局键。

    我只是在下面的代码中演示了如何做到这一点。

    class DeleteWidget extends StatefulWidget {
      @override
      _DeleteWidgetState createState() => _DeleteWidgetState();
    }
    
    class _DeleteWidgetState extends State<DeleteWidget> {
      callme() {
        print("here, you have to load data, method in delete from home1");
        setState((){}); // added
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Home1(
              callme: callme,
            ),
          ),
        );
      }
    }
    
    class Home1 extends StatefulWidget {
      final Function callme;
      Home1({this.callme});
      @override
      _Home1State createState() => _Home1State();
    }
    
    class _Home1State extends State<Home1> {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: RaisedButton(
            child: Text("press"),
            onPressed: () {
              print("here you add data in database");
              widget.callme();
            },
          ),
        );
      }
    }
    

    【讨论】:

    • 你误会了我的错误,如果我以你为例,凸起的按钮将在 home1state 构建中,按下它时,它将向我的数据库添加一个项目,然后重新加载 _DeleteWidgetState 在他的 init 方法中我从我的数据库中加载项目,然后提供 home1 的项目(对于 listview.builder() ),但由于 home1 已经构建,数据不会重新加载
    • 调用init状态是不可能的,所以你必须创建一个单独的方法,你可以调用和加载数据。
    • 更新基本上是我目前拥有的,因此数据不会重新加载
    • 你必须在 call me 方法中调用 setState。我编辑。
    【解决方案2】:
    class ParentWidget extends StatefulWidget {
      @override
      _ParentWidgetState createState() => _ParentWidgetState();
    }
    
    class _ParentWidgetState extends State<ParentWidget> {
      List<String> items = [];
    
      @override
      void initState() {
        getDataFromDataBase();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: MyList(
              items: items,
              refreshData: initState,
            ),
          ),
        );
      }
    
      getDataFromDataBase() {
    //    Get Data from Database
        setState(() {
          for (int i = 0; i < 4; i++) {
            items.add("Name $i");
          }
        });
      }
    }
    
    class MyList extends StatefulWidget {
      final Function refreshData;
      List<String> items = [];
    
      MyList({this.refreshData, this.items});
    
      @override
      _MyListState createState() => _MyListState();
    }
    
    class _MyListState extends State<MyList> {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: ListView.builder(
            itemBuilder: (context, index) {
              return Container(
                padding: EdgeInsets.all(10),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Text(widget.items[index]),
                    RaisedButton(
                      child: Text("Add item in Database"),
                      onPressed: () {
                        addItem();
                        widget.refreshData();
                      },
                    )
                  ],
                ),
              );
            },
            itemCount: widget.items.length,
          ),
        );
      }
    
      addItem() {
    //    Add item in database
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2023-03-31
      • 2023-04-11
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多