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 实例