1

我是 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. 我没有问题持续存在或访问不同页面上的提供者或驻留在页面上的任何子小部件,但我无法从对话框中访问提供者值。
  3. 当然,我可以将提供者的值作为参数传递给对话框,但我想知道是否有任何方法可以避免这种情况,因为我从提供者那里获得了很多值。

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

4

1 回答 1

0

您只想ProviderScope在两种情况下使用。首先是包装你提到的应用程序。另一种情况是使用ScopedProvider.

你基本上在这里做什么:

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

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

删除它ProviderScope,你应该得到你期望的结果。

于 2021-05-14T13:47:41.123 回答