#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. Спасибо за ваш ответ 🙂 Я попробую это и приму, если это сработает для меня.