我正在做一个项目,我被要求使用cubit进行国际化,最好是使用惰性方法。为此我有一个LocalizationContainer,如下所示:
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");
}
在我的主文件中,我有以下内容:
MaterialApp(
title: 'Example',
theme: exampleTheme(context),
debugShowCheckedModeBanner: false,
home: LocalizationContainer(
child: InitialScreenContainer(),
),
);
在本例中,LocalizationContainer的子容器是另一个表示屏幕的容器。每个屏幕被构造成容器、立方体和视图:
用于屏幕的容器具有以下结构:
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)),
),
);
}
}
每次需要打开新页面时,我做以下操作:
Navigator.of(blocContext).push(
MaterialPageRoute(
builder: (context) => BlocProvider.value(
value: BlocProvider.of<CurrentLocaleCubit>(blocContext),
child: NewScreenContainer(),
),
),
);
但是每当我试图重新加载一个错误时,就会弹出。只有在我重新启动的时候才能起作用。有人知道如何解决这个问题,还是这种国际化的方法是错误的?
发布于 2022-05-16 22:33:13
我并没有真正理解这个问题(我认为如果你把弹出的错误放出来,我可以帮你更多的忙),但是这样我就可以本地化了(我用的是整块)。首先,您需要在BlocProvider之上添加MaterialApp,这样他就可以成为上下文树中每个小部件的祖先,所以当您调用BlocProvider.of( context )时,您可以在树中的任何位置获得这个区域的实例(无需在您正在推送的每个屏幕上执行BlocProvider )。现在,当您更改应用程序的语言并生成新的状态时,BlocBuilder将使用新的语言重建整个应用程序。
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
],
),
);
}
}
https://stackoverflow.com/questions/72265170
复制相似问题