FutureProvider 坏了吗?
Is FutureProvider broken or something?
我尝试了这个简单的 FutureProvider 代码,但它给了我一个错误:
Error: Could not find the correct Provider<String> above this Consumer<String> Widge
我已确保 FutureProvider 包装我的 MaterialApp 并使用 Consumer 小部件获取提供者。
这是我的代码:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (_) => Future.value('test'),
catchError: (_, error) => print(error),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.amber,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(),
),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Consumer<String>(builder: (context, string, _) {
return Text(string);
}),
),
);
}
}
我是不是漏掉了什么?
该错误非常准确地描述了正在发生的事情,您正在尝试使用 String
,而您没有 String
的提供者。
如果你写 FutureProvider<String>(...etc
而不是 FutureProvider(...etc
你的 IDE 会指出 catchError
returns Void。这意味着您 return create
中的 String 和 catchError
中的 Void,使提供者输入 动态.
要解决此问题,请将 catchError
return 'error' 或您选择的任何内容,只要它是字符串即可。
catchError: (_, error) {
print(error);
return 'error';
},
编辑
正如第一条评论所指出的,您仍然会收到错误消息。由于 FutureProvider 没有 initialValue,因此它被设置为 null。这意味着第一个 运行 将向文本 Widget 传递一个空值。
例如,可以通过将 FutureProvider 的初始值设置为 'loading...' 来防止这种情况。
我尝试了这个简单的 FutureProvider 代码,但它给了我一个错误:
Error: Could not find the correct Provider<String> above this Consumer<String> Widge
我已确保 FutureProvider 包装我的 MaterialApp 并使用 Consumer 小部件获取提供者。
这是我的代码:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (_) => Future.value('test'),
catchError: (_, error) => print(error),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.amber,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(),
),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Consumer<String>(builder: (context, string, _) {
return Text(string);
}),
),
);
}
}
我是不是漏掉了什么?
该错误非常准确地描述了正在发生的事情,您正在尝试使用 String
,而您没有 String
的提供者。
如果你写 FutureProvider<String>(...etc
而不是 FutureProvider(...etc
你的 IDE 会指出 catchError
returns Void。这意味着您 return create
中的 String 和 catchError
中的 Void,使提供者输入 动态.
要解决此问题,请将 catchError
return 'error' 或您选择的任何内容,只要它是字符串即可。
catchError: (_, error) {
print(error);
return 'error';
},
编辑
正如第一条评论所指出的,您仍然会收到错误消息。由于 FutureProvider 没有 initialValue,因此它被设置为 null。这意味着第一个 运行 将向文本 Widget 传递一个空值。
例如,可以通过将 FutureProvider 的初始值设置为 'loading...' 来防止这种情况。