aissat / easy_localization

Easy and Fast internationalizing your Flutter Apps
https://pub.dev/packages/easy_localization
MIT License
913 stars 328 forks source link

NoSuchMethodError: The method 'get' was called on null. #79

Closed maxa11an closed 4 years ago

maxa11an commented 4 years ago

So I tried to use this for a new project I'm working on. Yet it is basically just the default app. However it throws below error.

The relevant error-causing widget was: 
MyHomePage file:///Users/maxallanniklasson/vipmonkey/_dev/app_flutter_public/lib/main.dart:24:13
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1      Localization._resolve (package:easy_localization/src/localization.dart:100:48)
#2      Localization.tr (package:easy_localization/src/localization.dart:58:35)
#3      tr (package:easy_localization/src/public.dart:8:31)
#4      _MyHomePageState.build (package:app_flutter_public/main.dart:58:9)

main.dart:

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:app_flutter_public/theme/style.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:easy_localization/easy_localization.dart';

void main() =>
    runApp(EasyLocalization(
      child: MyApp(),
      supportedLocales: [Locale('en', 'US'), Locale('sv', 'SE')],
      path: 'resources/langs',

    ),);

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: appTheme(),
      home: MyHomePage(),
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        EasyLocalization
            .of(context)
            .delegate,
      ],
      supportedLocales: EasyLocalization
          .of(context)
          .supportedLocales,
      locale: EasyLocalization
          .of(context)
          .locale,
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    log(tr("title"), name: this.toString());

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'titles',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

pubspec.yaml

name: app_flutter_public
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  easy_localization: 2.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

flutter:
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - resources/langs/sv_SE.json
    - resources/langs/en_US.json
    - resources/langs/sv.json
    - resources/langs/en.json

And the language files are there with one key:value each title.

aissat commented 4 years ago

@maxa11an I tried ur code and running well try clean project with flutter clean

maxa11an commented 4 years ago

Done, issue still remains.

psycura commented 4 years ago

Same issue

aissat commented 4 years ago

@psycura @maxa11an please need more information

psycura commented 4 years ago

Ok, here it is:

pubspec.yaml


environment:
  sdk: ">=2.6.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  provider: ^4.0.4
  get_it: 3.1.0
  hive: ^1.4.1+1
  hive_flutter: ^0.3.0+2
  easy_localization: ^2.0.0+1
  rxdart: ^0.23.1
  division: ^0.8.7+2
  sailor: ^0.6.0

  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner:

flutter_icons:

flutter:
  uses-material-design: true

  assets:
    - assets/langs/en.json
    - assets/langs/he.json
    - assets/langs/de.json
    - assets/images/

main.dart


import 'package:easy_localization/easy_localization.dart';
import 'package:eton_news/core/blocs/index.dart';
import 'package:eton_news/core/services/firestore_database.dart';
import 'package:eton_news/core/services/services.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'config/routes.dart';
import 'core/app/app_component.dart';

void main() async {
  Crashlytics.instance.enableInDevMode = true;
  FlutterError.onError = Crashlytics.instance.recordFlutterError;

  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);

  await HiveService.initHive();
  Routes.createRoutes();
  runApp(
    EasyLocalization(
      path: 'assets/langs',
      useOnlyLangCode: true,
      supportedLocales: [
        Locale('he'),
        Locale('en'),
        Locale('de'),
      ],
      child: AppComponent(
        userBlocBuilder: (_) => UserBloc(),
        databaseBuilder: (_) => FirestoreDatabase(),
      ),
    ),
  );
}

app_component.dart

import 'package:eton_news/config/routes.dart';
import 'package:eton_news/core/app/auth_widget.dart';
import 'package:eton_news/core/app/auth_widget_builder.dart';
import 'package:eton_news/core/blocs/index.dart';
import 'package:eton_news/core/domains/domains.dart';
import 'package:eton_news/core/services/firestore_database.dart';
import 'package:eton_news/core/services/services.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class AppComponent extends StatelessWidget {
  final UserBloc Function(BuildContext context) userBlocBuilder;

  final FirestoreDatabase Function(
    BuildContext context,
  ) databaseBuilder;

  const AppComponent({
    Key key,
    this.userBlocBuilder,
    this.databaseBuilder,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {

    var data = EasyLocalization.of(context);

    return MultiProvider(
      providers: [
        Provider<UserBloc>(
          create: userBlocBuilder,
          dispose: (_, userBloc) => userBloc.dispose(),
        ),
      ],
      child: AuthWidgetBuilder(
        databaseBuilder: databaseBuilder,
        builder: (BuildContext context, AsyncSnapshot<User> userSnapshot) {
          return MaterialApp(
            title: 'Eton.News',
            theme: ThemeData(fontFamily: 'OpenSansHebrew'),
            debugShowCheckedModeBanner: false,
            navigatorKey: Routes.sailor.navigatorKey,
            onGenerateRoute: Routes.sailor.generator(),
            home: AuthWidget(userSnapshot: userSnapshot),
            localizationsDelegates: [
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
              EasyLocalization.of(context).delegate,
            ],
            locale: Locale('he'),
          );
        },
      ),
    );
  }
}

Error:


I/flutter (29381): ════════
I/flutter (29381): Warning: This application's locale, en_US, is not supported by all of its
I/flutter (29381): localization delegates.
I/flutter (29381): > A Localization delegate that supports the en_US locale was not found.
I/flutter (29381): See https://flutter.dev/tutorials/internationalization/ for more
I/flutter (29381): information about configuring an app's locale, supportedLocales,
I/flutter (29381): and localizationsDelegates parameters.
I/flutter (29381): ════════
I/flutter (29381): 
I/flutter (29381): Flutter error caught by Crashlytics plugin:
I/flutter (29381): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (29381): The following NoSuchMethodError was thrown building SchoolSelectorHead(dirty, dependencies:
I/flutter (29381): [MediaQuery]):
I/flutter (29381): The method 'get' was called on null.
I/flutter (29381): Receiver: null
I/flutter (29381): Tried calling: get("login_screen.welcomeMessage")
I/flutter (29381): 
I/flutter (29381): The relevant error-causing widget was:
I/flutter (29381):   SchoolSelectorHead
I/flutter (29381):   file:///Users/eugenealitz/projects/AppWize/eton_news_flutter/lib/ui/app_loading/app_loading_screen.dart:25:15
I/flutter (29381): 
I/flutter (29381): When the exception was thrown, this was the stack:
I/flutter (29381): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
I/flutter (29381): #1      Localization._resolve (package:easy_localization/src/localization.dart:99:48)
I/flutter (29381): #2      Localization.tr (package:easy_localization/src/localization.dart:57:35)
I/flutter (29381): #3      tr (package:easy_localization/src/public.dart:8:31)
I/flutter (29381): #4      SchoolSelectorHead.build (package:eton_news/ui/login/school_selector_head.dart:29:13)

Also, strange things happen on change locale - if i try to change locale to Locale('he'), i see in console that locale was changed to 'he_IL', but right after it another message with locale 'he_US'

PS: In version 1.4.1 - everything work fine (except issue with current page translations on locale change)

ghost commented 4 years ago

https://github.com/oneLab-Projects/picbox/tree/ac4c54129108f21cdf9d69eb022bc27b62c7ac24/ I have the same problem. Please fix


════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building App(dirty):
The method 'get' was called on null.
Receiver: null
Tried calling: get("profile.night_theme")

The relevant error-causing widget was
    App 
lib\main.dart:16
When the exception was thrown, this was the stack
#0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
#1      Localization._resolve 
package:easy_localization/src/localization.dart:99
#2      Localization.tr 
package:easy_localization/src/localization.dart:57
#3      tr 
package:easy_localization/src/public.dart:8
#4      StringTranslateExtension.tr 
package:easy_localization/src/public_ext.dart:40
...
════════════════════════════════════════════════════════════════════════════════
aissat commented 4 years ago

@Laim0n @maxa11an @psycura thnx for reporting, I'm working on

aissat commented 4 years ago

So I tried to use this for a new project I'm working on. Yet it is basically just the default app. However it throws below error.

The relevant error-causing widget was: 
MyHomePage file:///Users/maxallanniklasson/vipmonkey/_dev/app_flutter_public/lib/main.dart:24:13
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1      Localization._resolve (package:easy_localization/src/localization.dart:100:48)
#2      Localization.tr (package:easy_localization/src/localization.dart:58:35)
#3      tr (package:easy_localization/src/public.dart:8:31)
#4      _MyHomePageState.build (package:app_flutter_public/main.dart:58:9)

main.dart:

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:app_flutter_public/theme/style.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:easy_localization/easy_localization.dart';

void main() =>
    runApp(EasyLocalization(
      child: MyApp(),
      supportedLocales: [Locale('en', 'US'), Locale('sv', 'SE')],
      path: 'resources/langs',

    ),);

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: appTheme(),
      home: MyHomePage(),
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        EasyLocalization
            .of(context)
            .delegate,
      ],
      supportedLocales: EasyLocalization
          .of(context)
          .supportedLocales,
      locale: EasyLocalization
          .of(context)
          .locale,
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    log(tr("title"), name: this.toString());

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'titles',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

pubspec.yaml

name: app_flutter_public
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  easy_localization: 2.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

flutter:
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - resources/langs/sv_SE.json
    - resources/langs/en_US.json
    - resources/langs/sv.json
    - resources/langs/en.json

And the language files are there with one key:value each title.

@maxa11an u have a file naming error use - not _

    - resources/langs/sv_SE.json # to sv-SE.json 
    - resources/langs/en_US.json # to en-US.json 
    - resources/langs/sv.json
    - resources/langs/en.json

@Laim0n about ur code i fixed check RPs this

@psycura plz check JSON file probably wrong file or wrong name

psycura commented 4 years ago

@psycura plz check JSON file probably wrong file or wrong name

I think you wrong, because i use same jsons, that use with 1.4.1. I think that this issue is related to parameter useOnlyLangCode: true, I think plugin still try to seek locales by 'langCode_coutryCode'