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(),
    );
  }
}