首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带肘的国际化

带肘的国际化
EN

Stack Overflow用户
提问于 2022-05-16 20:22:40
回答 1查看 92关注 0票数 0

我正在做一个项目,我被要求使用cubit进行国际化,最好是使用惰性方法。为此我有一个LocalizationContainer,如下所示:

代码语言:javascript
运行
复制
class LocalizationContainer extends BlocContainer {
  final Widget child;

  LocalizationContainer({required this.child});

  @override
  Widget build(BuildContext context) {
    return BlocProvider<CurrentLocaleCubit>(
      create: (context) => CurrentLocaleCubit(),
      child: child,
    );
  }
}

class CurrentLocaleCubit extends Cubit<String> {
  CurrentLocaleCubit() : super("pt-br");
  CurrentLocaleCubit() : super("en-us");
}

在我的主文件中,我有以下内容:

代码语言:javascript
运行
复制
MaterialApp(
      title: 'Example',
      theme: exampleTheme(context),
      debugShowCheckedModeBanner: false,
      home: LocalizationContainer(
        child: InitialScreenContainer(),
      ),
);

在本例中,LocalizationContainer的子容器是另一个表示屏幕的容器。每个屏幕被构造成容器、立方体和视图:

用于屏幕的容器具有以下结构:

代码语言:javascript
运行
复制
class ExampleScreenContainer extends BlocContainer {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (_) => ExampleScreenCubit(),
      child: I18NLoadingContainer(
        language: BlocProvider.of<CurrentLocaleCubit>(context).state,
        viewKey : "Example",
        creator: (messages) => ExampleScreenView(ExampleScreenViewLazyI18N(messages)),
      ),
    );
  }
}

每次需要打开新页面时,我做以下操作:

代码语言:javascript
运行
复制
Navigator.of(blocContext).push(
      MaterialPageRoute(
        builder: (context) => BlocProvider.value(
          value: BlocProvider.of<CurrentLocaleCubit>(blocContext),
          child: NewScreenContainer(),
        ),
      ),
    );

但是每当我试图重新加载一个错误时,就会弹出。只有在我重新启动的时候才能起作用。有人知道如何解决这个问题,还是这种国际化的方法是错误的?

EN

回答 1

Stack Overflow用户

发布于 2022-05-16 22:33:13

我并没有真正理解这个问题(我认为如果你把弹出的错误放出来,我可以帮你更多的忙),但是这样我就可以本地化了(我用的是整块)。首先,您需要在BlocProvider之上添加MaterialApp,这样他就可以成为上下文树中每个小部件的祖先,所以当您调用BlocProvider.of( context )时,您可以在树中的任何位置获得这个区域的实例(无需在您正在推送的每个屏幕上执行BlocProvider )。现在,当您更改应用程序的语言并生成新的状态时,BlocBuilder将使用新的语言重建整个应用程序。

代码语言:javascript
运行
复制
class AppProvider extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(providers: [
      BlocProvider<AppBloc>(
        create: (_) => sl<AppBloc>()
    //get app default language
          ..add(const AppEvent.initialEvent()),
      ),
    ], child: App());
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<AppBloc, AppState>(
      builder: (context, state) => MaterialApp(
        debugShowCheckedModeBanner: false,
        home: SplashScreen()),
        locale: state.language == AppLanguageKeys.AR
            ? const Locale('ar', '')
            : const Locale('en', ''),
        localizationsDelegates: [
          AppLocalizations.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        supportedLocales: [
          const Locale('en', ''), // English
          const Locale('ar', ''), // Arabic
        ],
      ),
    );
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72265170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档