Flutter Provider 解释:发生异常。 ProviderNotFoundException异常
Flutter Provider explanation : Exception has occurred. ProviderNotFoundException
我是 Flutter 新手。我有下面的代码,它不是 运行。我知道如何修复错误(一种解决方案)。但我想在这里了解为什么它不是 运行 的概念。此外,所有其他解决此问题的不同解决方案。
我想知道下面代码为什么会出错的详细解释?
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>(
create: (context) => "Passing Data",
child: MaterialApp(
title: Provider.of<String>(context),
home: HomePage(),
),
);
}
}
您可以继续阅读 BuildContext, Provider and InheritedWidget,但我也可以提供一个简明的解释:
您不能在返回它的同一个小部件中使用 Provider。它必须是继承的(即 Provider 必须来自父或祖先小部件)或具有单独的上下文。如果您仍想在那里使用它,则必须在上面创建一个单独的小部件(即父小部件),然后包含 MaterialApp。这主要是因为 Context 引用。上下文用于从小部件的祖先提取数据(在本例中,是上面提供的值),Provider 只不过是 InheritedWidget[= 的包装器35=],因此为了获取提供的值,上下文必须是继承的或者是它自己的上下文。
在您的情况下,Provider 必须位于父小部件上以便您可以继承传递给您的值,或者您必须使用类似 Consumer 小部件的东西或 Builder 小部件,它提供自己的上下文,但从不使用相同的上下文来注入和获取提供程序。
您可以这样做,其中 Builder 小部件提供自己的 context:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>(
create: (context) => "Passing Data",
child: Builder(
builder: (context) {
return MaterialApp(
title: Provider.of<String>(context),
home: HomePage()
);
}
),
);
}
}
或者像这样,您在 runApp 中看到我们如何将 Provider 包装在 MyApp 周围,创建层次结构,允许要由 MyApp 小部件继承的上下文,您可以从中安全地获取提供的值。
void main() {
runApp(
Provider<String>(
create: (context) => "Passing Data",
child: MyApp()
)
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: Provider.of<String>(context),
home: HomePage(),
);
}
}
我是 Flutter 新手。我有下面的代码,它不是 运行。我知道如何修复错误(一种解决方案)。但我想在这里了解为什么它不是 运行 的概念。此外,所有其他解决此问题的不同解决方案。
我想知道下面代码为什么会出错的详细解释?
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>(
create: (context) => "Passing Data",
child: MaterialApp(
title: Provider.of<String>(context),
home: HomePage(),
),
);
}
}
您可以继续阅读 BuildContext, Provider and InheritedWidget,但我也可以提供一个简明的解释:
您不能在返回它的同一个小部件中使用 Provider。它必须是继承的(即 Provider 必须来自父或祖先小部件)或具有单独的上下文。如果您仍想在那里使用它,则必须在上面创建一个单独的小部件(即父小部件),然后包含 MaterialApp。这主要是因为 Context 引用。上下文用于从小部件的祖先提取数据(在本例中,是上面提供的值),Provider 只不过是 InheritedWidget[= 的包装器35=],因此为了获取提供的值,上下文必须是继承的或者是它自己的上下文。
在您的情况下,Provider 必须位于父小部件上以便您可以继承传递给您的值,或者您必须使用类似 Consumer 小部件的东西或 Builder 小部件,它提供自己的上下文,但从不使用相同的上下文来注入和获取提供程序。
您可以这样做,其中 Builder 小部件提供自己的 context:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>(
create: (context) => "Passing Data",
child: Builder(
builder: (context) {
return MaterialApp(
title: Provider.of<String>(context),
home: HomePage()
);
}
),
);
}
}
或者像这样,您在 runApp 中看到我们如何将 Provider 包装在 MyApp 周围,创建层次结构,允许要由 MyApp 小部件继承的上下文,您可以从中安全地获取提供的值。
void main() {
runApp(
Provider<String>(
create: (context) => "Passing Data",
child: MyApp()
)
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: Provider.of<String>(context),
home: HomePage(),
);
}
}