Вложенный Flutter Futurebuilder не обновляет представление - PullRequest
0 голосов
/ 08 мая 2020

У меня есть виджет с отслеживанием состояния, который я показываю внутри виджета без сохранения состояния. Я повторно использовал этот виджет в нескольких частях своего приложения, где он работал.

Виджет выглядит примерно так

  class InnerWidget extends StatefulWidget {

  // private keys for objects in the remote dataahase
  List<int> privateKeys;

  const InnerWidgt({
    Key key,
    this.privateKeys,
  }) : super(key: key);

  @override
  _InnerWidgetState createState() => _InnerWidgetState();
}

class _InnerWidgetState extends State<InnerWidget> {

  // data retrieved from the database
  Future<List<SomeClass>> data;

  @override
  void initState() {
    this.data = this.fetchData(widget.privateKeys);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<SomeClass>> (
      future: this.data,
      builder: (BuildContext contest, AsyncSnapshot<List<SomeClass>> snapshot) {
        if(snapshot.hasData){
            // return a widget (a list of names in this case)
        }
        return Text('Loading...');
      }
    );
  }

  Future<List<SomeClass>> fetchData(List<int> pKeys){
    // fetches the JSON objects from the server and returns them as instances
  }
}

Виджет создается и получает список ключей, он вызывает удаленный API для получения некоторых объектов и отображает их в списке. Я подумал, что было бы неплохо, что этот виджет сам по себе управляется, но, может быть, это плохой дизайн? навсегда. Однако snapshot.hasData действительно возвращает true, поэтому я думаю, что это какая-то проблема с перекраской.

Представление, о котором я говорю, где это используется, является подробным представлением, к которому вы переходите из списка (ListView). Я использую точно такой же InnerWidget в элементах внутри ListView, где он отлично работает. Но когда я нажимаю на элемент, чтобы перейти на страницу с подробностями, тот же InnerWidget не работает. (Я знаю, что получать одни и те же данные дважды - это нехорошо, у меня в голове есть это, чтобы изменить это, а под ним уже есть кеш). Может быть, это как-то связано с сохраненным состоянием в ElementTree? Это потому, что я использую тот же InnerWid git, он сохраняет свое состояние и не перерисовывает?

Надеюсь, я достаточно хорошо сформулировал свой вопрос, я не хотел бросать сотни строк кода у вас, поэтому создал хотя бы этот минимальный пример виджета. Я могу добавить список и часть навигации, если нужно, но, возможно, это то, что тот, кто больше работал с Flutter, сразу знает, у меня всего 3 недели.

...