无法在子窗口小部件中使用Provider.of

时间:2020-07-19 18:22:57

标签: flutter dart provider

我有这样的main(),其中MultiProvider包裹着LocalizedApp进行了本地化:

void main() async {
  setupLocator();
  var delegate = await LocalizationDelegate.create(
    fallbackLocale: 'fa',
    supportedLocales: ['fa'],
  );
  FluroRouter.setupRouter();
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterDownloader.initialize(debug: true);
  runApp(
    LocalizedApp(
      delegate,
      MultiProvider(
        providers: [
          StreamProvider<ConnectionStatus>(
            create: (context) =>
                ConnectivityService().connectivityController.stream,
            initialData: ConnectionStatus.offline,
          ),
          ChangeNotifierProvider<AppState>(
            create: (BuildContext context) => AppState(),
          ),
        ],
        child: MyApp(),
      ),
    ),
  );
}

和MyApp类如下,再次用LocalizationProvider包装:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appstate = Provider.of<AppState>(context);
    var localizationDelegate = LocalizedApp.of(context).delegate;

    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      statusBarColor: appstate.statusBarColor,
    ));

    return LocalizationProvider(
      state: LocalizationProvider.of(context).state,
      child: GestureDetector(
        onTap: () {
          FocusScopeNode currentFocus = FocusScope.of(context);

          if (!currentFocus.hasPrimaryFocus) {
            currentFocus.unfocus();
          }
        },
        child: MaterialApp(
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            localizationDelegate
          ],
          supportedLocales: localizationDelegate.supportedLocales,
          locale: localizationDelegate.currentLocale,
          theme: appstate.currentTheme,
          initialRoute: 'landing',
          onGenerateRoute: FluroRouter.router.generator,
        ),
      ),
    );
  }
}

但即使在我尝试使用Provider.of<AppState>(context)的初始路线是“着陆”的情况下,也会引发此错误:

Error: Could not find the correct Provider<AppState> above this Landing Widget

This likely happens because you used a `BuildContext` that does not include the provider
of your choice. There are a few common scenarios:

- The provider you are trying to read is in a different route.

  Providers are "scoped". So if you insert of provider inside a route, then
  other routes will not be able to access that provider.

- You used a `BuildContext` that is an ancestor of the provider you are trying to read.

  Make sure that Landing is under your MultiProvider/Provider<AppState>.
  This usually happen when you are creating a provider and trying to read it immediatly.

  For example, instead of:

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

  consider using `builder` like so:

  Widget build(BuildContext context) {
    return Provider<Example>(
      create: (_) => Example(),
      // we use `builder` to obtain a new `BuildContext` that has access to the provider
      builer: (context) {
        // No longer throws
        return Text(context.watch<Example>()),
      }
    ),
  }

我不知道我在做什么错! 我也在使用Fluro v.1.5.1进行导航。

0 个答案:

没有答案