У меня есть виджет с отслеживанием состояния, который я показываю внутри виджета без сохранения состояния. Я повторно использовал этот виджет в нескольких частях своего приложения, где он работал.
Виджет выглядит примерно так
class InnerWidget extends StatefulWidget {
// private keys for objects in the remote dataahase
List<int> privateKeys;
const InnerWidgt({
Key key,
this.privateKeys,
}) : super(key: key);
@override
_InnerWidgetState createState() => _InnerWidgetState();
}
class _InnerWidgetState extends State<InnerWidget> {
// data retrieved from the database
Future<List<SomeClass>> data;
@override
void initState() {
this.data = this.fetchData(widget.privateKeys);
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<SomeClass>> (
future: this.data,
builder: (BuildContext contest, AsyncSnapshot<List<SomeClass>> snapshot) {
if(snapshot.hasData){
// return a widget (a list of names in this case)
}
return Text('Loading...');
}
);
}
Future<List<SomeClass>> fetchData(List<int> pKeys){
// fetches the JSON objects from the server and returns them as instances
}
}
Виджет создается и получает список ключей, он вызывает удаленный API для получения некоторых объектов и отображает их в списке. Я подумал, что было бы неплохо, что этот виджет сам по себе управляется, но, может быть, это плохой дизайн? навсегда. Однако snapshot.hasData
действительно возвращает true, поэтому я думаю, что это какая-то проблема с перекраской.
Представление, о котором я говорю, где это используется, является подробным представлением, к которому вы переходите из списка (ListView). Я использую точно такой же InnerWidget в элементах внутри ListView, где он отлично работает. Но когда я нажимаю на элемент, чтобы перейти на страницу с подробностями, тот же InnerWidget не работает. (Я знаю, что получать одни и те же данные дважды - это нехорошо, у меня в голове есть это, чтобы изменить это, а под ним уже есть кеш). Может быть, это как-то связано с сохраненным состоянием в ElementTree? Это потому, что я использую тот же InnerWid git, он сохраняет свое состояние и не перерисовывает?
Надеюсь, я достаточно хорошо сформулировал свой вопрос, я не хотел бросать сотни строк кода у вас, поэтому создал хотя бы этот минимальный пример виджета. Я могу добавить список и часть навигации, если нужно, но, возможно, это то, что тот, кто больше работал с Flutter, сразу знает, у меня всего 3 недели.