Flutter FutureBuilder не ждет обновления приложения

#flutter #flutter-futurebuilder

#Flutter #Flutter-FutureBuilder

Вопрос:

Проблема Мой FutureBuilder ожидает при первом запуске приложения, но не ждет при обновлении приложения.

Когда мое приложение завершает загрузку, и я переключаюсь на другую кнопку переключения, FutureBuilder начинает перезапускаться немедленно вместо ожидания getData() и полностью завершается до завершения getData(), а затем, когда getData() окончательно завершена, FutureBuilder запускается снова.

Эта проблема не возникает при первом запуске приложения. При первом запуске приложения FutureBuilder ожидает завершения getData() перед запуском.

Мне нужно, чтобы FutureBuilder ждал завершения getData() при нажатии другой кнопки, как это происходит при первом запуске приложения.

Примечание: я удалил столько ненужного кода, сколько мог, для удобства чтения. Я могу добавить больше кода, если это поможет.

Код:

 class PriceScreenState extends State<PriceScreen> {
  String selectedCurrency = 'USD';
  String selectedGraphType = "1D";
      var isSelectedGraph = <bool>[true, false, false, false, false, false];

getData() async {
    isWaiting = true;
    try {
      Map graphData = await GraphData().getGraphData(
          selectedCurrency: selectedCurrency,
          selectedGraphType: selectedGraphType);
      isWaiting = false;
      setState(() {
        graphValues = graphData;
      });
    } catch (e) {
      print(e);
    }
  }

 @override
  void initState() {
    super.initState();
    futureData = getData();
  }

@override
  Widget build(BuildContext context) {
...(other code)...
ToggleButtons( ****************TOGGLEBUTTONS***********
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.symmetric(horizontal: 16.0),
                    child: Text('1D'),
                  ),
                 ...(more Buttons)...
                ],
                onPressed: (int index) {
                  setState(() {
                    for (int buttonIndex = 0;
                        buttonIndex < isSelectedGraph.length;
                        buttonIndex  ) {
                      if (buttonIndex == index) {
                        isSelectedGraph[buttonIndex] = true;
                        selectedGraphType = graphType[buttonIndex];
                      } else {
                        isSelectedGraph[buttonIndex] = false;
                      }
                    }
                  });
                  getData();
                },
                isSelected: isSelectedGraph,
              ),
              Expanded(
                child: FutureBuilder( *************FUTUREBUILDER*********
                    future: futureData,
                    builder: (context, snapshot) {
                      if (graphValues.isEmpty) {
                        return new Container();
                      } else {
                        return Graph(graphValues);
                      }
                    }),
              )
  

Комментарии:

1. вы snapshot никоим образом не используете, у вас есть несколько примеров в официальной FutureBuilder документации, просто следуйте им

2. @pskink спасибо, я это проверю 🙂

Ответ №1:

Поскольку вы используете a FutureBuilder , вам больше не нужно звонить setState . Вот возможная переработка вашего кода:

 Future<Map> futureData;

Future<Map> getData() async {
   try {
      Map graphData = await GraphData().getGraphData(
         selectedCurrency: selectedCurrency,
         selectedGraphType: selectedGraphType,
      );
      return graphData;
   } catch (e) {
      throw Exception(e);
   }
}

@override
void initState() {
   super.initState();
   futureData = getData();
}

@override
Widget build(BuildContext context) {
   // Only coding the FutureBuilder for the example
   return FutureBuilder<Map>(
      future: futureData,
      builder: (context, snapshot) {
         // Future is still loading
         if (!snapshot.hasData)
            return CircularProgressIndicator();
         else if (snapshot.data.isEmpty)
            return Container();
         else
            return Graph(snapshot.data);
      },
   );
}
  

Для FutureBuilder правильной работы вам необходимо вернуть значение в вашем getData и использовать snapshot переменную.

Комментарии:

1. Спасибо за ваш ответ 🙂 Я попробую это и приму, если это сработает для меня.