Прежде всего, вы звоните getCategories();
в вашем initState()
методе без причины. Поскольку getCategories()
просто создает и возвращает будущее, которое вы не используете в initState, этот вызов не имеет значения. Вы можете просто удалить эту строку или даже весь метод initState()
.
Тогда этот код в основном ничего не делает:
case ConnectionState.none:
return RaisedButton(
onPressed: () => getCategories(),
);
Чтобы показать кнопку, которая перезагружает будущее, вы можете вместо этого обновить состояние следующим образом. Это перестроит ваш виджет и, следовательно, перестроит будущее.
case ConnectionState.none:
return RaisedButton(
onPressed: () {
setState(() {});
},
);
Но в любом случае. Если все, чего вы хотите добиться - это индикатор загрузки во время загрузки Future, я бы предпочел наблюдать атрибут hasData
снимка. Примерно так может работать:
return FutureBuilder (
future: getCategories(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
if (snapshot.data) {
return ListView.builder(
itemCount: asyncSnapshot.data.length,
itemBuilder: (context, int index) {
return ListTile(
title: Text(asyncSnapshot.data[index]['name']),
);
},
);
}
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}
);
Просто для ясности. Ошибка, которую вы видите, связана с этой ошибкой:
case ConnectionState.done:
if (asyncSnapshot.hasData)
return Text(asyncSnapshot.error.toString());
Ваше высказывание здесь, что если будущее сделано и получены некоторые данные, вы показываете ошибку вместо данных.