简体   繁体   English

从父页面重新加载小部件内的 listview.builder

[英]Reload listview.builder inside a widget from parent page

I started developing on flutter 5 months ago for my school project and I have a problem. 5 个月前,我开始为我的学校项目开发 flutter,但我遇到了一个问题。

I made a custom Widget that uses Listview.builder() lets call this myList widget, it is called in parentPage , then, I add a new item to my database from myList then setState() to the parentPage where I am loading my items from database, parentPage is reloading however myList and its items are not.我制作了一个使用Listview.builder()的自定义Widget ,让我们调用这个myList小部件,它在parentPage中调用,然后,我将一个新项目从myList添加到我的数据库,然后将setState()添加到我从中加载项目的parentPage数据库, parentPage正在重新加载,但myList及其项目没有。 parentPage & myList are both stateful. parentPagemyList都是有状态的。

My question is how can you build (or init?) a second time myList so that the item added is shown.我的问题是如何构建(或初始化?)第二次myList以便显示添加的项目。

I saw similar questions but I couldn't understand how I could apply the answers to listview.builder()我看到了类似的问题,但我不明白如何将答案应用于listview.builder()

I'm sorry, I cannot put any code I am not allowed because of a contract.抱歉,由于合同原因,我不能输入任何我不允许的代码。

You want to call child widget's method from parent widget, which is possible using global key.您想从父小部件调用子小部件的方法,这可以使用全局键。

I just demonstrated how to do it in following code.我只是在下面的代码中演示了如何做到这一点。

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();
        },
      ),
    );
  }
}
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
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM