ilteoood / flutter_i18n

I18n made easy, for Flutter!
MIT License
217 stars 57 forks source link

Inproper use of Null check operator #170

Closed hkirk closed 3 years ago

hkirk commented 3 years ago

Seems like checking forcedLocale isn't set.

E/flutter (12703): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value E/flutter (12703): #0 FlutterI18n.refresh (package:flutter_i18n/flutter_i18n.dart:87:74)

ilteoood commented 3 years ago

That's pretty strange: you have a null instance of FlutterI18n, which means that isn't loaded correctly.

Can you show me how did you configured it, or create a reproduction repo?

hkirk commented 3 years ago

Something like this - can try and make a reproduction repo, if nessesary.

Future<void> main() async {
  final FlutterI18nDelegate flutterI18nDelegate = FlutterI18nDelegate(
    translationLoader: FileTranslationLoader(
        useCountryCode: false,
        fallbackFile: 'en',
        basePath: 'assets/i18n'),
  );
  WidgetsFlutterBinding.ensureInitialized();
  await flutterI18nDelegate.load(Locale("en"));
  runApp(AppWidget(flutterI18nDelegate));
}

class AppWidget extends StatelessWidget {
  final FlutterI18nDelegate _flutterI18nDelegate;
  final AppRouter _router = AppRouter();

  AppWidget(this._flutterI18nDelegate);

  @override
  Widget build(BuildContext context) {
    Future.delayed(Duration.zero, () async {
      Locale? currentLocale = FlutterI18n.currentLocale(context);
      final currentLang = currentLocale == null ? "en" : currentLocale.languageCode;
      await FlutterI18n.refresh(context, Locale(currentLang));
    });
   return MultiBlocProvider(
      providers: [
        ...
      ],
      child: MaterialApp.router(
        title: "Test",
        localizationsDelegates: [
          _flutterI18nDelegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        debugShowCheckedModeBanner: false,
        routerDelegate: _router.delegate(),
        routeInformationParser: _router.defaultRouteParser(),
      ),
    );
}
ilteoood commented 3 years ago

IMO is correct the error in this case.

The Future.delayed is executed before the _flutterI18nDelegate in the localizationsDelegates, so we don't have the i18n instance attached to the context.

IDK if that is for reproduction purpose, but the content of the delayed function is already made in the delegate

buzzySmile commented 3 years ago

Catch the same issue with the Storybook package when integrate localization to storybook example.

════════ Exception caught by widgets library ═══════════════════════════════════
The following _CastError was thrown building Builder(dirty):
Null check operator used on a null value

The relevant error-causing widget was
Builder
package:flutter_template/main.dart:38
When the exception was thrown, this was the stack
#0      FlutterI18n.translate
#1      MyApp.build.<anonymous closure>
#2      Builder.build
#3      StatelessElement.build
#4      ComponentElement.performRebuild
...
════════════════════════════════════════════════════════════════════════════════
ilteoood commented 3 years ago

@buzzySmile

I've integrated it without any problem

image

Can you provide an example repository?

ilteoood commented 3 years ago

Closed for inactivity.