Перезагрузить listview.builder внутри виджета с родительской страницы - PullRequest
0 голосов
/ 06 мая 2020

Я начал разрабатывать на flutter 5 месяцев a go для своего школьного проекта, и у меня возникла проблема.

Я сделал собственный Widget, который использует Listview.builder(), давайте назовем это myList виджет вызывается в parentPage , затем я добавляю новый элемент в свою базу данных из myList , затем setState() в parentPage , где я загрузка моих элементов из базы данных, parentPage перезагружается, однако myList и его элементы - нет. parentPage и myList имеют состояние.

Мой вопрос: как вы можете построить (или запустить?) Второй раз myList , чтобы отображается добавленный элемент.

Я видел похожие вопросы, но не мог понять, как применить ответы к listview.builder()

Извините, я не могу ввести код, которым я не являюсь разрешено по контракту.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020
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
  }
}
0 голосов
/ 06 мая 2020

Вы хотите вызвать метод дочернего виджета из родительского виджета, что возможно с помощью глобального ключа.

Я только что продемонстрировал, как это сделать, в следующем коде.

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