Flutter Web App 错误 - 找不到正确的提供者
Flutter Web App Error - Could not find the correct Provider
在 WebApp 中使用 Provider 时出现以下错误。我以前在创建 none webapps 时见过这个问题,通常可以修复它。但是我看不到错误在 webapp 中的位置。我正在 Main.dart 和 MaterialApp 小部件上方创建 MultiProvider。
这是错误:
Error: Could not find the correct Provider<List> above this CategoryWidget Widget
发生这种情况是因为您使用的 BuildContext
不包括提供商
任您选择。
还有我的 MultiProvider 代码:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: Firebase.initializeApp(),
builder: (context, snapshot) {
// Check for errors
if (snapshot.hasError) {
return MaterialApp(
home: Scaffold(
body: Container(
alignment: Alignment.center,
child: const Text('ERROR: DID NOT INITIALIZE FIREBASE!')),
),
);
}
if (snapshot.connectionState == ConnectionState.done) {
print("FIREBASE INITIALIZED");
final catCollection = FirebaseFirestore.instance
.collection('categories')
.orderBy("active", descending: true);
final categories = catCollection.snapshots().map((snapShot) =>
snapShot.docs
.map((catDoc) => Category.fromMap(catDoc.data(), catDoc.id))
.toList());
return MultiProvider(
providers: [
StreamProvider<User?>(
create: (_) => FirebaseAuth.instance.authStateChanges(),
initialData: null,
),
StreamProvider<List<Category?>>(
create: (_) => categories,
initialData: [],
),
ChangeNotifierProvider.value(
value: Categories(),
),
ChangeNotifierProvider.value(
value: Auth(),
),
],
child: MaterialApp(
title: "Qi Gang's Dashboard",
debugShowCheckedModeBanner: false,
// home: LoginSignupScreen(isLoginForm: true),
initialRoute: LoginSignupScreen.id,
routes: {
LoginSignupScreen.id: (context) =>
LoginSignupScreen(isLoginForm: true),
MainScaffold.id: (context) => MainScaffold(),
在小部件树的下方,从 MainScaffold 调用的是我的 CategoryWidget,错误发生的位置:
Widget categoryGrid(BuildContext context) {
final categories = Provider.of<List<Category>>(context);
我已经尝试解决这个问题一段时间了,但现在被屏蔽了,所以如果你能指出我这里哪里出错了,我将不胜感激。
非常感谢
您可以在提供商官方文档中阅读。 here
context.watch<T>(), which makes the widget listen to changes on T
context.read<T>(), which returns T without listening to it
context.select<T, R>(R cb(T value)), which allows a widget to listen to only a small part of T.
这些方法将从与传递的 BuildContext 关联的小部件开始在小部件树中查找,并将 return the nearest variable of type T
找到(如果没有找到则抛出)。
并且在您的代码中,您在提供程序中定义了 <List<Category?>>
,并且您正在寻找 <List<Category>>
小部件树,因此这会给您带来错误。
您需要将提供程序添加(或初始化)到main.dart,然后尝试使用它。
一定会成功的。
在 WebApp 中使用 Provider 时出现以下错误。我以前在创建 none webapps 时见过这个问题,通常可以修复它。但是我看不到错误在 webapp 中的位置。我正在 Main.dart 和 MaterialApp 小部件上方创建 MultiProvider。 这是错误:
Error: Could not find the correct Provider<List> above this CategoryWidget Widget
发生这种情况是因为您使用的 BuildContext
不包括提供商
任您选择。
还有我的 MultiProvider 代码:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: Firebase.initializeApp(),
builder: (context, snapshot) {
// Check for errors
if (snapshot.hasError) {
return MaterialApp(
home: Scaffold(
body: Container(
alignment: Alignment.center,
child: const Text('ERROR: DID NOT INITIALIZE FIREBASE!')),
),
);
}
if (snapshot.connectionState == ConnectionState.done) {
print("FIREBASE INITIALIZED");
final catCollection = FirebaseFirestore.instance
.collection('categories')
.orderBy("active", descending: true);
final categories = catCollection.snapshots().map((snapShot) =>
snapShot.docs
.map((catDoc) => Category.fromMap(catDoc.data(), catDoc.id))
.toList());
return MultiProvider(
providers: [
StreamProvider<User?>(
create: (_) => FirebaseAuth.instance.authStateChanges(),
initialData: null,
),
StreamProvider<List<Category?>>(
create: (_) => categories,
initialData: [],
),
ChangeNotifierProvider.value(
value: Categories(),
),
ChangeNotifierProvider.value(
value: Auth(),
),
],
child: MaterialApp(
title: "Qi Gang's Dashboard",
debugShowCheckedModeBanner: false,
// home: LoginSignupScreen(isLoginForm: true),
initialRoute: LoginSignupScreen.id,
routes: {
LoginSignupScreen.id: (context) =>
LoginSignupScreen(isLoginForm: true),
MainScaffold.id: (context) => MainScaffold(),
在小部件树的下方,从 MainScaffold 调用的是我的 CategoryWidget,错误发生的位置:
Widget categoryGrid(BuildContext context) {
final categories = Provider.of<List<Category>>(context);
我已经尝试解决这个问题一段时间了,但现在被屏蔽了,所以如果你能指出我这里哪里出错了,我将不胜感激。
非常感谢
您可以在提供商官方文档中阅读。 here
context.watch<T>(), which makes the widget listen to changes on T
context.read<T>(), which returns T without listening to it
context.select<T, R>(R cb(T value)), which allows a widget to listen to only a small part of T.
这些方法将从与传递的 BuildContext 关联的小部件开始在小部件树中查找,并将 return the nearest variable of type T
找到(如果没有找到则抛出)。
并且在您的代码中,您在提供程序中定义了 <List<Category?>>
,并且您正在寻找 <List<Category>>
小部件树,因此这会给您带来错误。
您需要将提供程序添加(或初始化)到main.dart,然后尝试使用它。 一定会成功的。