flutter - Flutter Provider-Consumer 异常错误
问题描述
代码在几周前运行良好,然后突然我在日志中得到了这个。
I/flutter (14128):══╡ 小部件库发现的异常
I/flutter (14128):在构建 Consumer(dirty) 时引发了以下 ProviderNotFoundException:
I/flutter (14128):错误:在此消费者小部件上方找不到正确的提供者
I/flutter (14128):提供者是“范围的”。因此,如果您在路由中插入提供程序,则 I/flutter (14128): 其他路由将无法访问该提供程序。
I/flutter (14128): - 你使用了BuildContext
一个你试图读取的提供者的祖先。
I/flutter (14128):确保 Consumer 在您的 MultiProvider/Provider 下。
I/flutter (14128):这通常发生在您创建提供程序并尝试立即读取它时。
I/flutter (14128):例如,而不是:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// Will throw a ProviderNotFoundError, because `context` is associated
// to the widget that is the parent of `Provider<Example>`
child: Text(context.watch<Example>()),
),
}
I/flutter (14128):考虑builder
像这样使用:
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// we use `builder` to obtain a new `BuildContext` that has access to the provider
builder: (context) {
// No longer throws
return Text(context.watch<Example>()),
}
),
}
I/flutter (14128):如果这些解决方案都不起作用,请考虑在 StackOverflow 上寻求帮助:
I/flutter (14128):相关的导致错误的小部件是:
我/颤振(14128):消费者
我/颤振(14128):/lib/custom_widgets/favorite_widget.dart:18:12
I/flutter (14128):抛出异常时,这是堆栈:
I/flutter (14128): #0 Provider._inheritedElementOf (package:provider/src/provider.dart:309:7)
I/flutter (14128): #1 Provider.of (package:provider/src/provider.dart:261:30)
I/flutter (14128): #2 Consumer.buildWithChild (package:provider/src/consumer.dart:177:16) ═══════════════════════ ═══════════════════════════════════════════
I/flutter (14128):抛出了另一个异常:错误:在此之上找不到正确的提供程序
就是这样(当前)
Widget build(BuildContext context) {
return Consumer<FavoriteModel>(
builder: (context, house, child) => IconButton(
onPressed: () {
这是在我更改它以尝试按照错误中的方法修复它之后(但不起作用)
Widget build(BuildContext context) {
return Provider<FavoriteModel>(
create: (_FavoriteWidgetState) => FavoriteModel,
builder: (context, house, child) {
return Text(context.watch<FavoriteModel>());
IconButton(
onPressed: ()
解决方案
尝试在 main.dart 文件中添加 ChangeNotifier。就像下面的例子:
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
/// wrap MaterialApp in Provider widget
return ChangeNotifierProvider(
create: (context) => YourModel(), // ← create/init your state model
child: MaterialApp(
home: ScreenA()
),
);
}
}```
推荐阅读
- c++ - 未找到 LLVM JIT 符号
- php - 相同键的两个数组值相减,并在php中获得匹配和不匹配值的结果
- php - 在 Eloquent 中从数组中删除对象
- javascript - Promise.resolve 内部引用混淆
- azure - 使用 Terraform 时如何查询 2 个不同的 Azure 目录?
- python - 从 python 文件加载函数时遇到问题
- javascript - 如何强制用户按顺序点击 div?
- segmentation-fault - google-assistant-demo 和 googlesamples-assistant-hotword 分段错误
- wordpress - Wordpress 如何使过滤器在 Wordpress API 中返回 author_name
- php - 作曲家更新最后说 Trait 'Carbon\Traits\Mixin' not found