Riverpod:子组件不能读取父组件的provider作用域



下面的代码用于打开一个新的客户添加小部件。

final newOrderIdScopedProvider = Provider.autoDispose<int>((ref) {
ref.onDispose(() { 
debugPrint('newOrderIdScopedProvider of value ${ref.state} has been disposed');
});
throw UnimplementedError('newOrderIdScopedProvider has not been initialized');
});
Navigator.of(context).push(
HeroDialogRoute(
builder: (_) => ProviderScope(
overrides: [
newOrderIdScopedProvider.overrideWithValue(orderId),
],
child: const AddNewCustomerWidget(),
),
),
);

newOrderIdScopedProvider重载了这个页面,因为它可能会从不同的地方有不同的orderid打开

现在看AddNewCustomerWidget

SizedBox(
width: 1100,
height: 600,
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Scaffold(
key: addNewCustomerNotifier.scaffoldKey,
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SizedBox(
width: 1100,
height: 600,
child: Column(
children: const [
AddNewCustomerHeader(),
AddNewCustomerTextField(),
VerticalSpacer(height: 10),
Divider(),
AddNewCustomerTabsWidget(),
AddNewCustomerTabsView(),
],
),
),
),
),
),
),
);

问题是,从AddNewCustomerWidget的构建方法内部,可以读取newOrderIdScopedProvider,一切正常。

,

当我试图从AddNewCustomerHeader()AddNewCustomerTextField()或任何人的孩子的构建方法中读取newOrderIdScopedProvider时,

我得到错误消息,newOrderIdScopedProvider没有被初始化。

为什么会发生这种情况?

我找到了解决方案

问题是AddNewCustomerWidget是一个StatefulWidget (ConsumerStatefulWidget),并且看起来,ScopedProvider不能被StatefulWidget的子组件读取

结论是提供者的范围只能读一个小部件的孩子如果的小部件是无状态的小部件(ConsumerWidget)

,我只是把子元素包装到一个单独的ConsumerWidget中,这个ConsumerWidget也被一个ProviderScope包装到newOrderIdScopedProvider

一切顺利

相关内容

最新更新