Flutter - 使用惰性国际化进行热重载时出错
Flutter - Error in hot reload using lazy internationalization
我正在构建一个使用惰性国际化的应用程序,这样应用程序中将没有翻译文件,并且在打开新页面时将从 Internet 获取所有翻译。为此,我正在使用本地化肘。
我的应用程序的每个屏幕都分为一个接收翻译消息作为参数的“视图”、一个包含 cubit 屏幕及其状态的“cubit”以及一个包含 BlocProvider 的“容器”肘和屏风。
现在我的应用程序从演示屏幕开始,然后进入登录屏幕,最后进入主屏幕。
所以在主文件中,我没有直接使用演示屏幕,而是使用本地化容器,演示容器作为它的 child:
return MaterialApp(
title: 'My App',
theme: myTheme(context),
debugShowCheckedModeBanner: false,
home: LocalizationContainer(
child: PresentationContainer(),
),
);
PresentationContainer 是这样组成的:
class PresentationContainer extends BlocContainer {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => PresentationCubit(),
child: I18NLoadingContainer(
language: BlocProvider.of<CurrentLocaleCubit>(context).state,
viewKey : "Presentation",
creator: (messages) => PresentationView(PresentationViewLazyI18N(messages)),
),
);
}
}
所以在容器中我有一个带有 PresentationCubit 和 I18NLoadingContainer 的 BlocProvider 作为 child。
I18NLoadingContainer 只是根据提供的语言和屏幕名称获取转换后的消息,在本例中为“Presentation”。翻译后的消息在变量消息中返回,因此此消息作为参数传递到屏幕。
如果我只将它用于我的演示屏幕,一切正常,但当我需要打开一个新页面时就会出现问题。
演示屏幕后,我需要打开登录屏幕。所以在 PresentationView 中,当用户点击按钮打开登录屏幕时,我有以下功能:
void _goToLogin(BuildContext blocContext) {
Navigator.of(blocContext).pushReplacement(
MaterialPageRoute(
builder: (context) => BlocProvider.value(
value: BlocProvider.of<CurrentLocaleCubit>(blocContext),
child: LoginContainer(),
),
),
);
}
并且 LoginContainer 与 PresentationContainer 一样工作:
class LoginContainer extends BlocContainer {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => LoginCubit(),
child: I18NLoadingContainer(
language: BlocProvider.of<CurrentLocaleCubit>(context).state,
viewKey : "Login",
creator: (messages) => LoginView(LoginViewLazyI18N(messages)),
),
);
}
}
如果我保持在演示屏幕并使用热重载一切正常,但如果我使用这种方法打开一个新屏幕,我在尝试使用热重载时遇到以下错误:
The following _CastError was thrown building Builder(dirty): Null
check operator used on a null value
我不确定当您更改路由时您的 LoginContainer 是否仍被 LocalizationContainer 包裹。我建议您在 MaterialApp 小部件上方提供一个 CurrentLocaleCubit 并检查它是否正常工作。我认为您丢失了一个 CurrentLocaleCubit 实例
我正在构建一个使用惰性国际化的应用程序,这样应用程序中将没有翻译文件,并且在打开新页面时将从 Internet 获取所有翻译。为此,我正在使用本地化肘。
我的应用程序的每个屏幕都分为一个接收翻译消息作为参数的“视图”、一个包含 cubit 屏幕及其状态的“cubit”以及一个包含 BlocProvider 的“容器”肘和屏风。
现在我的应用程序从演示屏幕开始,然后进入登录屏幕,最后进入主屏幕。
所以在主文件中,我没有直接使用演示屏幕,而是使用本地化容器,演示容器作为它的 child:
return MaterialApp(
title: 'My App',
theme: myTheme(context),
debugShowCheckedModeBanner: false,
home: LocalizationContainer(
child: PresentationContainer(),
),
);
PresentationContainer 是这样组成的:
class PresentationContainer extends BlocContainer {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => PresentationCubit(),
child: I18NLoadingContainer(
language: BlocProvider.of<CurrentLocaleCubit>(context).state,
viewKey : "Presentation",
creator: (messages) => PresentationView(PresentationViewLazyI18N(messages)),
),
);
}
}
所以在容器中我有一个带有 PresentationCubit 和 I18NLoadingContainer 的 BlocProvider 作为 child。
I18NLoadingContainer 只是根据提供的语言和屏幕名称获取转换后的消息,在本例中为“Presentation”。翻译后的消息在变量消息中返回,因此此消息作为参数传递到屏幕。
如果我只将它用于我的演示屏幕,一切正常,但当我需要打开一个新页面时就会出现问题。
演示屏幕后,我需要打开登录屏幕。所以在 PresentationView 中,当用户点击按钮打开登录屏幕时,我有以下功能:
void _goToLogin(BuildContext blocContext) {
Navigator.of(blocContext).pushReplacement(
MaterialPageRoute(
builder: (context) => BlocProvider.value(
value: BlocProvider.of<CurrentLocaleCubit>(blocContext),
child: LoginContainer(),
),
),
);
}
并且 LoginContainer 与 PresentationContainer 一样工作:
class LoginContainer extends BlocContainer {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => LoginCubit(),
child: I18NLoadingContainer(
language: BlocProvider.of<CurrentLocaleCubit>(context).state,
viewKey : "Login",
creator: (messages) => LoginView(LoginViewLazyI18N(messages)),
),
);
}
}
如果我保持在演示屏幕并使用热重载一切正常,但如果我使用这种方法打开一个新屏幕,我在尝试使用热重载时遇到以下错误:
The following _CastError was thrown building Builder(dirty): Null check operator used on a null value
我不确定当您更改路由时您的 LoginContainer 是否仍被 LocalizationContainer 包裹。我建议您在 MaterialApp 小部件上方提供一个 CurrentLocaleCubit 并检查它是否正常工作。我认为您丢失了一个 CurrentLocaleCubit 实例