我有下面的无状态小部件。我尝试使用BlocProvider.of<SettingsCubit>(context).updateSettings(newSettings);
访问SettingsOverlay
类中的SettingsCubit
,但它抛出ProviderNotFoundException。也尝试使用MaterialPageRoute而不是模态,但它有同样的问题。MovieBloc
在带有BlocBuilder
的MovieList
小部件中正常工作,并按要求刷新。
我说的对吗,这与MovieList
和BlocProvider在同一个小部件树中有关,而模态/新页面是一个不同的(子)树?如果是这样,BlocProvider.value
不应该将数据传递给SettingsOverlay
吗?
下面是widget的完整代码:
class MovieScreen extends StatelessWidget {
const MovieScreen({super.key});
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<SettingsCubit>(
create: (_) => SettingsCubit(),
),
BlocProvider<MovieBloc>(
create: (_) =>
MovieBloc(httpClient: http.Client())..add(MovieFetched()),
)
],
child: Scaffold(
appBar: AppBar(
title: const Text('Movies'),
actions: [
IconButton(
onPressed: () => {
showModalBottomSheet(
useSafeArea: true,
context: context,
builder: (_) {
return BlocProvider.value(
value: context.read<SettingsCubit>(),
child: const SettingsOverlay(),
);
},
),
},
icon: const Icon(Icons.add),
),
],
),
body: const MovieList(),
),
);
}
}
class SettingsOverlay extends StatelessWidget {
const SettingsOverlay({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Settings")),
body: Column(
children: [
ElevatedButton(
onPressed: () {
print("save");
BlocProvider.of<SettingsCubit>(context)
.updateSettings(Settings());
},
child: const Text("Save"),
),
],
),
);
}
}
1条答案
按热度按时间rm5edbpk1#
问题是在您刚刚创建的同一上下文上阅读
SettingsCubit
。context.read
将查找小部件树(不是当前的)。您可以为单独的上下文添加另一个构建器。