Как создать несколько экземпляров одного и того же поставщика в flutter

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