Flutter на iOS: Несмотря на вызов Firebase.initializeApp() в будущем конструкторе, приложение не инициализируется

# #ios #firebase #flutter

Вопрос:

Название говорит само за себя. Ниже приведены соответствующие классы и их соответствующие коды.

главная.дротик

 ... //Imports
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => NotificationService())
      ],
      child: MaterialApp(
        localizationsDelegates: [
          GlobalMaterialLocalizations.delegate,
        ],
        supportedLocales: [
          const Locale('en', ''),
          const Locale('pt', 'BR'),
        ],
        home: MyHomePage(),
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StartPage(),
      ),
    );
  }
}
 

Начальная страница.дротик

 ... //Imports
class StartPage extends StatelessWidget {
  Future<void> init(BuildContext context) async {
    Firebase.initializeApp(); //Firebase initialization
    await Provider.of<NotificationService>(context, listen: false).init();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: init(context),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting)
            return LoadingSpinner();
          else {
            return StreamBuilder<User?>(
              stream: AuthService().userChanges,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return LoadingSpinner();
                } else {
                  print(snapshot.hasData);
                  return snapshot.hasData ? MainScreen() : AuthPage();
                }
              },
            );
          }
        });
  }
}
 

pubspec.yaml

 ...
version: 1.0.0 1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  flutter_spinkit: ^5.1.0
  brasil_fields: ^1.1.4
  image_picker: ^0.8.4 2
  provider: ^6.0.0
  firebase_auth: ^3.1.1
  cloud_firestore: ^2.5.3
  firebase_storage: ^10.0.3
  firebase_core: ^1.7.0
  firebase_messaging: ^10.0.7
  flutter_typeahead: ^3.2.1
  rxdart: ^0.27.2
  table_calendar: ^3.0.2
  flutter_form_builder: ^6.1.0 1
  http: ^0.13.4
  flutter_localizations: 
    sdk: flutter
    version: ^0.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
...
 

Когда я пытаюсь запустить приложение на эмуляторе Android, даже на устройстве Android, оно работает нормально. Однако в эмуляторе iOS отображается следующая ошибка:

 [VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
 

Даже несмотря на то, что я вызываю Firebase.initializeApp на StartPage.dart асинхронным методом. Пожалуйста, помогите!

Ответ №1:

Вы пробовали это сделать?

     Future<void> init(BuildContext context) async {
       WidgetsFlutterBinding.ensureInitialized();//Add this line
       Firebase.initializeApp(); //Firebase initialization
       await Provider.of<NotificationService>(context, listen: false).init();
  }
 

Но, согласно документации, это в основном(){}

 void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(App());
}
 

Комментарии:

1. Я не делал этого раньше, сделал сейчас, и это сработало! Хотя это не сработало на main, только в init. Спасибо!

2. Пожалуйста.