#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));
});
}