使用GetMaterialApp后切换语言失效

在主文件中保存了LocaleWrapfinal localeWrap = Get.put(LocaleWrap());

同时在build方法中使用Obx

Obx(() =>GetMaterialApp(
                    initialRoute: Routes.root,
                    getPages: Routes.getPages(),
                    localizationsDelegates: [
                      CatDelegate.delegate,
                      GlobalMaterialLocalizations.delegate,
                      GlobalWidgetsLocalizations.delegate,
                      GlobalCupertinoLocalizations.delegate
                    ],
                    locale: localeWrap.locale.value,
                    supportedLocales: BaseLocalization.supportedLocales,
                    theme: ThemeData(
                      primarySwatch: themeWrap.primaryColor.value,
                      primaryColor: themeWrap.primaryColor.value.shade500,
                    ),
                    home: HomePage(),
                  ));

在切换语言时调用:

Get.find<LocaleWrap>().locale.value = Locale.fromSubtags(languageCode: val);

发现Obx调用了重建,但是语言没有切换。

通过另一种方式实现Flutter国际化可以知道通过多层传递最终传递到_LocalizationsScopelocale

但是经过调试发现每次切换到英文时传递的仍然是中文Locale。

通过查看源码发现GetMaterialApp内只是对MaterialApp进行了二次封装:

            MaterialApp(
                key: _.unikey,
                navigatorKey: (navigatorKey == null
                    ? Get.key
                    : Get.addKey(navigatorKey!)),
                scaffoldMessengerKey:
                    scaffoldMessengerKey ?? _.scaffoldMessengerKey,
                home: home,
                routes: routes ?? const <String, WidgetBuilder>{},
                initialRoute: initialRoute,
                onGenerateRoute:
                    (getPages != null ? generator : onGenerateRoute),
                onGenerateInitialRoutes: (getPages == null || home != null)
                    ? onGenerateInitialRoutes
                    : initialRoutesGenerate,
                onUnknownRoute: onUnknownRoute,
                navigatorObservers: (navigatorObservers == null
                    ? <NavigatorObserver>[
                        GetObserver(routingCallback, Get.routing)
                      ]
                    : <NavigatorObserver>[
                        GetObserver(routingCallback, Get.routing)
                      ]
                  ..addAll(navigatorObservers!)),
                builder: defaultBuilder,
                title: title,
                onGenerateTitle: onGenerateTitle,
                color: color,
                theme: _.theme ?? theme ?? ThemeData.fallback(),
                darkTheme:
                    _.darkTheme ?? darkTheme ?? theme ?? ThemeData.fallback(),
                themeMode: _.themeMode ?? themeMode,
                locale: Get.locale ?? locale,//如果Get.locale首次赋值之后后面一直使用该值,不使用locale的
                localizationsDelegates: localizationsDelegates,
                localeListResolutionCallback: localeListResolutionCallback,
                localeResolutionCallback: localeResolutionCallback,
                supportedLocales: supportedLocales,
                debugShowMaterialGrid: debugShowMaterialGrid,
                showPerformanceOverlay: showPerformanceOverlay,
                checkerboardRasterCacheImages: checkerboardRasterCacheImages,
                checkerboardOffscreenLayers: checkerboardOffscreenLayers,
                showSemanticsDebugger: showSemanticsDebugger,
                debugShowCheckedModeBanner: debugShowCheckedModeBanner,
                shortcuts: shortcuts,
                scrollBehavior: scrollBehavior,
                useInheritedMediaQuery: useInheritedMediaQuery,
                //   actions: actions,
              ),

期中locale属性Get.locale ?? locale

意思就是如果Get.locale有值的话locale的属性是用不到的。

如果Get.locale为空则使用locale同时把locale值赋值给Get.locale

所以首次启动时的语言(中文)会赋值给Get.locale。之后这个属性便有值了,后面不会再接受更新。

找到问题了,接下来我们只要更新Get.locale就好了。

方便的是Get提供了Get.updateLocale方法更新Get.locale的值。

我们只要在Obx包裹的locale处使用Get.locale,同时在更新时把原来的更新改为Get.updateLocale(Locale.fromSubtags(languageCode: val));

评论列表,共 0 条评论

    暂无评论