1

我是新来的。

在用户登录时找到我的应用程序语言环境信息。所以这个想法是当用户登录时,它将语言环境传递给 AppLanguage。

我已经编写了 ChangeNotifierProxyProvider 来获取身份验证信息中的语言环境并创建一个 AppLanuage 对象

在 ChangeNotifierProxyProvider 中,我将 appLang 设为 null。auth 对象正确地不为空。

我不明白为什么我会为空?

我确实在这里创建了它,对吗?

create: (_) => AppLanguage(),

它不应该作为更新的参数吗?

Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(value: Auth()),
        ChangeNotifierProxyProvider<Auth, AppLanguage>(
            create: (_) => AppLanguage(),
            update: (ctx, auth, appLang) {
              print(auth);
              print(appLang);
            }
            //appLang.setLocale(auth == null ? 'en' : auth.language),
            ),
      ],
      child: Consumer2<Auth, AppLanguage>(
        builder: (ctx, auth, lang, child) => MaterialApp(
          title: 'Test App',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          locale: lang.appLocal,
          supportedLocales: [
            const Locale('en', 'US'),
            const Locale('ja', ''),
          ],
          localizationsDelegates: [
            AppLocalizations.delegate,
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          home: LandingView(),
        ),
      ),
    );
  }
4

1 回答 1

0

我会尝试类似的东西:

ChangeNotifierProxyProvider<Auth, AppLanguage>(
  create: (_) => AppLanguage(),
  update: (ctx, auth, appLang) => appLang..update(auth),
),
class AppLanguage with ChangeNotifier {
  void update(Auth auth) {
    // Do some custom work based on myModel that may call `notifyListeners`
  }
}

这样,您的孩子将能够在可用时获得正确的更新值。

您可以在提供者文档上查看更多如何正确处理该问题。

于 2020-09-24T15:30:32.870 回答