Использование FutureBuilder в виджете с отслеживанием состояния Flutter с индикатором обновления

#flutter

Вопрос:

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

 Future<List<Data>> getData(Thing thing) async {
  var response = await http.get(Uri.parse(MY_URL));
  // do some processing
  return data;
}
 

После этого я определил виджет с отслеживанием состояния, который вызывает эту функцию и использует будущее для отображения списка.

 class DataList extends StatefulWidget {
  const DataList({Key key}) : super(key: key);

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

class _DataListState extends State<DataList> {
  Widget createListView(BuildContext context, AsyncSnapshot snapshot) {
    List<Data> values = snapshot.data;

    if (values.isEmpty) {
      return NoResultsWidget('No results.');
    }

    return ListView.builder(
      itemCount: values.length,
      itemBuilder: (BuildContext context, int index) {
        return values[index];
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    var data = getSomething().then((thing) => getData(thing));

    return FutureBuilder(
      future: data,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.none:
            return CustomErrorWidget('Error');
          case ConnectionState.waiting:
            return LoadingWidget();
          default:
            if (snapshot.hasError) {
              return CustomErrorWidget('Error.');
            } else {
              return createListView(context, snapshot);
            }
        }
      },
    );
  }
}
 

Теперь код работает просто отлично таким образом. Но когда я пытаюсь переместить свои данные в переменную класса (типа Future<Список>), которую я обновляю с помощью метода initState, переменная просто никогда не обновляется. Пример кода ниже:

 class _DataListState extends State<DataList> {
  Future<List<Data>> data;

  ....

  @override
  void initState() {
    super.initState();
    updateData();
  }

  void updateData() {
    data = getSomething().then((thing) => getData(thing));
  }

  ....

}

 

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

Ответ №1:

Вам нужно обернуть назначение data переменной, setState чтобы Flutter знал, что переменная изменилась, и перестроил ваш виджет.

Например:

   void updateData() {
    setState(() {
        data = getSomething().then((thing) => getData(thing));
    });
  }