Tworzę flutter App i mam zintegrowaną Firebase, ale wciąż pojawia się ten błąd, gdy klikam przycisk, aby się zarejestrować, zalogować lub wylogować. Widziałem innych ludzi, którzy zadawali to samo pytanie, ale wydaje mi się, że żadna z nich nie działa. Używam Fluttera i Android Studio. Czy może jakaś pomoc?
To jest fragment mojego kodu
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.red,
body: Center(
child: Container(
child: RaisedButton(
onPressed: () {
FirebaseAuth.instance.signOut().then((value) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) =>
LoginScreen()));
});
},
child: Text("Logout"),
)
)
)
);
}
}
Poniżej znajduje się zgłoszony wyjątek
══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
When the exception was thrown, this was the stack:
#0 MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
#1 Firebase.app (package:firebase_core/src/firebase.dart:52:41)
#2 FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
#3 _HomeScreenState.build.<anonymous closure> (package:cosytok/screens/home.dart:20:28)
#4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
#6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
#7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
#8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
#9 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:219:7)
#10 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:477:9)
#11 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:78:12)
#12 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:124:9)
#13 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#14 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:122:18)
#15 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:108:7)
#16 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:220:19)
#17 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
#18 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
#19 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
#20 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
#24 _invoke1 (dart:ui/hooks.dart:267:10)
#25 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer:
TapGestureRecognizer#f0104
════════════════════════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
źródło
ensureInitislized
, tworzy instancjęWidgetbinding
i ponieważFirebase.initializeApp()
musi używać kanałów platformy do wywołania natywnego, a następnie musisz zainicjować powiązanie. api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/… (kanał platformy jest w silniku flutter)Dodaj do pubspec.yaml
dodaj do main.dart
import 'package:firebase_core/firebase_core.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
źródło
initializeApp()
jest to wywołanie asynchroniczne, aplikacja nadal będzie się uruchamiać, nawet jeśli się nie powiedzieJeśli chcesz połączyć firebase z aplikacją flutter, musisz zainicjować firebase przed użyciem. Możesz to zadeklarować, jak podano poniżej, a to pomoże Ci rozwiązać problem
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
W filmie szczegółowo omówisz błąd
źródło
Oto proste rozwiązanie:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp(),); }
źródło
Odpowiedź @ petera jest doskonała !! ale jeśli nadal otrzymujesz błąd w kodzie i podążasz za flutter firebase codelab, pamiętaj, że te samouczki są nieaktualne od sierpnia 2020 r. i nie zostały jeszcze zaktualizowane. musisz wprowadzić wiele innych zmian, takich jak:
.data
z.data()
updateData
zupdate
Mam nadzieję, że może to pomóc niektórym początkującym, takim jak ja.
źródło
Jeśli zastosowałeś się do odpowiedzi Petera i nadal otrzymujesz ten sam błąd, sprawdź, czy
main
poawait Firebase.initializeApp()
wywołaniu pojawi się cokolwiek innego, co masz w funkcji , na przykład:void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; runApp(MyApp()); }
źródło
Jeśli nadal masz problem po opuszczeniu aplikacji na ekranie głównym, możesz dodać to do dowolnego
.dart
pliku za pomocą firebase:class App extends StatelessWidget { final Future<FirebaseApp> _initialization = Firebase.initializeApp(); @override Widget build(BuildContext context) {
Lub w przypadku
StatefulWidget
:import 'package:flutter/material.dart'; // Import the firebase_core plugin import 'package:firebase_core/firebase_core.dart'; void main() { runApp(App()); } class App extends StatefulWidget { _AppState createState() => _AppState(); } class _AppState extends State<App> { // Set default `_initialized` and `_error` state to false bool _initialized = false; bool _error = false; // Define an async function to initialize FlutterFire void initializeFlutterFire() async { try { // Wait for Firebase to initialize and set `_initialized` state to true await Firebase.initializeApp(); setState(() { _initialized = true; }); } catch(e) { // Set `_error` state to true if Firebase initialization fails setState(() { _error = true; }); } } @override void initState() { initializeFlutterFire(); super.initState(); } @override Widget build(BuildContext context) { // Show error message if initialization failed if(_error) { return SomethingWentWrong(); } // Show a loader until FlutterFire is initialized if (!_initialized) { return Loading(); } return MyAwesomeApp(); } }
Więcej informacji znajdziesz pod tym linkiem .
źródło
No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
. Zainicjowałem już Firebase w widżecie stanowym.1. dodaj tę zależność:
Drugi: w głównej funkcji projektu dodaj te 2 linie i ustaw funkcję asynchroniczną
void main() async { // these 2 lines WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // runApp(MyApp()); }
teraz możesz normalnie używać Firebase w dowolnym pliku lub widżecie w projekcie.
Widżet FutureBuilder również będzie działał, ale musisz go dodawać za każdym razem, gdy chcesz uzyskać dostęp do firebase.
źródło
Musisz dodać,
await Firebase.initializeApp();
który jest plikiemFuture
. Zrób to w pliku dart, który uruchamia funkcję Firebase, jak poniżej:import 'package:firebase_core/firebase_core.dart'; ... Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MaterialApp()); }
źródło