В initState () вам нужно вернуть будущее и присвоить его переменной mainTotal, например:
mainTotal = calculateTotal();
В противном случае переменная будет иметь значение null, а когда вы добавите значение позжепеременная, которую FutureBuilder не сможет реализовать.
Вот пример, похожий на ваш код, чтобы понять проблему:
Future<int> mainTotal;
int total = 0;
int multiple;
@override
void initState() {
super.initState();
print("before calculateTotal() mainTotal: $mainTotal");
mainTotal = calculateTotal();
print("after calculateTotal() mainTotal: $mainTotal");
}
Future<int> calculateTotal() async {
print("calculateTotal() starting...");
await Future.delayed(Duration(seconds: 3));
List<List<int>> itemLists = [
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 4]
];
for (int i = 0; i < itemLists.length; i++) {
int noOfItems = itemLists[i].length;
int unitPrice = itemLists[i].length;
multiple = noOfItems * unitPrice;
total += multiple;
}
print("calculateTotal() finished");
return total;
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {});
},
),
body: Center(
child: FutureBuilder(
future: mainTotal, // a previously-obtained Future<String> or null
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
print("connectionState: none");
return Text('Awaiting result...');
case ConnectionState.active:
print("connectionState: active");
return Text('Awaiting result...');
case ConnectionState.waiting:
print("connectionState: waiting");
return Text('Awaiting result...');
case ConnectionState.done:
print("connectionState: done");
if (snapshot.hasError) return Text('Error: ${snapshot.error}');
return Text('Total: ${snapshot.data}');
}
return null; // unreachable
},
),
),
);
}
И это вывод отпечатков:
I/flutter (30319): before calculateTotal() mainTotal: null
I/flutter (30319): calculateTotal() starting...
I/flutter (30319): after calculateTotal() mainTotal: Instance of 'Future<int>'
I/flutter (30319): connectionState: waiting
I/flutter (30319): calculateTotal() finished
I/flutter (30319): connectionState: done
Если вы неверните переменную, и вы назначите ее позже, это будет вывод:
I/flutter (30799): before calculateTotal() mainTotal: null
I/flutter (30799): calculateTotal() starting...
I/flutter (30799): after calculateTotal() mainTotal: null
I/flutter (30799): connectionState: none
I/flutter (30799): calculateTotal() finished