从对话框访问 Flutter 钩子的提供程序

问题描述

我是 Flutter hooks 和 riverpod 的新手

基本上,我有一个提供程序将书籍列表存储在书架中。

class BookList extends StateNotifier<List<BookModel>> {
  BookList() : super([]);

  void setBookList(List<BookModel> bookList) =>
     {state = bookList};
}

final bookListProvider = StateNotifierProvider<BookList>((_) => BookList());

然后我有一个显示书籍的页面和一个显示创建新书籍对话框的创建按钮:

class BookShelfPage extends HookWidget {
  @override
  Widget build(BuildContext context) {
      final bookList = useProvider(bookListProvider.state);
      
      useEffect(() {
        //API to get list of books
        context.read(bookListProvider).setBookList(//data from API);
      },[]);

      final Function() onCreateBookButtonClicked = () {      
        showDialog(
          context: context,builder: (context) => ProviderScope(
            child: (new BookCreateDialog())));
      };


      //Data is available for this
      print("book list length 1: " + bookList.length.toString()); 
  }

但是,我无法访问对话框中的提供程序值:

class BookCreateDialog extends HookWidget {
   @override
   Widget build(BuildContext context) {
      final bookList = useProvider(bookListProvider.state);
      
      //Data is not available for this
      print("book list length 2: " + bookList.length.toString()); 
   }
}

注意事项:

  1. 我有一个 ProviderScope 来包装我的应用程序。
  2. 我在跨不同 PAGES 或驻留在 PAGES 上的任何子窗口小部件中坚持或访问提供程序没有任何问题,但我无法从对话框访问提供程序值。
  3. 当然,我可以将提供者的值作为参数传递给对话框,但我想知道是否有任何方法可以避免这种情况,因为我从提供者那里获得了很多值。

我可以知道如何解决这个问题吗?非常感谢!

解决方法

您只想在两种情况下使用 ProviderScope。第一个是按照您提到的方式包装您的应用程序。另一种情况是使用 ScopedProvider

您在这里的主要工作:

builder: (context) => ProviderScope(child: BookCreateDialog());

正在创建一个新范围,其中您的 StateNotifierProvider 的值不可用(因为该值位于您应用根目录的 ProviderScope 中)。

去掉那个 ProviderScope,你应该会得到你期望的结果。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...