#flutter #dart #flutter-provider
#flutter #dart #flutter-provider
Вопрос:
Я использую провайдера для извлечения данных и уведомления слушателей следующим образом:
class CategoryProvider with ChangeNotifier {
Future<void> getData() async {
......
......
notifyListeners();
}
}
Мой CategoryListView
виджет прослушивает этого провайдера следующим образом:
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
Я создаю новый экземпляр CategoryListView
следующим образом:
Navigator.of(context).pushNamed(CategoryListView.routeName);
Я запускаю новые экземпляры CategoryListView
из CategoryListView
самого виджета.
Он отлично работает при запуске новых экземпляров, но при переходе назад все CategoryListView
виджеты показывают данные последнего CategoryListView
виджета, помещенного в стек, поскольку он прослушивает того же провайдера.
Как я могу создать новый экземпляр поставщика и связать его с экземпляром виджета? Есть ли лучший подход для решения этой проблемы?
Комментарии:
1. Когда-нибудь решали эту проблему?
2. @Lee, я нашел решение и опубликовал его в качестве ответа. Пожалуйста, проверьте, поможет ли это вам.
Ответ №1:
Я решил эту проблему и публикую решение, чтобы оно могло кому-то помочь.
Новый экземпляр поставщика объявляется в CategoryListView
классе следующим образом:
final CategoryProvider collectionData = CategoryProvider();
Аналогично, вместо передачи связанных данных в CategoryListView
качестве аргументов навигатора, я передал их как значения конструктора, чтобы эти значения были доступны в initState()
функции.
Следовательно, нажатие нового экземпляра CategoryListView
изменяется с
Navigator.of(context).pushNamed(CategoryListView.routeName);
Для
Navigator.push(context, MaterialPageRoute(builder: (context) =>
CategoryPage(constructorValue) ));
В initState()
функции задайте необходимые значения для поставщика и выполните необходимые вызовы функций.
collectionData.catalogueId = widget.catalogueId;
collectionData.loadNextPage();
При включении Widget build(BuildContext context)
прослушивание поставщика изменяется с
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
Для
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Color(0xff04063E),
title: Text(widget.catalogueName != null ? widget.catalogueName : ""),
),
body: ChangeNotifierProvider.value(
value: collectionData,
child: Consumer<CategoryProvider>(builder: (_, ctl, __) {
return _buildUI(collectionData);
}),
),
);
}
Где _buildUI(collectionData)
— функция, которая создает пользовательский интерфейс из предоставленного экземпляра collectionData
.
Кроме того, утилизируйте экземпляр поставщика в dispose:
@override
void dispose() {
collectionData.dispose();
super.dispose();
}