Can't link flutter web application to firebase project / infinite loading
Solution 1
Okay I just changed the way that I initialize my project in my main.dart
Like this:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(App());
}
instead of that:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
And i put my firestore database in Test mode.
Solution 2
For firebase in web there is a different package. Please check this one Firebase_core_web
Arthur
I am currently working as a developer, I have already participated in the creation of a small online FPS, I am interested in big development projects in video games such as Star Citizen or S&Box and in my free time I try to develop experimental games on Unity.
Updated on January 01, 2023Comments
-
Arthur over 1 year
I have a problem when I try to link my Flutter web project to my Firebase. I add the elements, imports and SDK and when I touch the main.dart to initialize the firebase functions, even if the code doesn't show any error, when I launch the application from my IDE with google, I'm facing an infinite loading screen. And sometimes there is not even the blue loading bar. All the SDK, my IDE and my frameworks are up to date in stable version.
I have configured a firebase project with only this application and I Initialized a firestore database like I saw in the CRUD that I followed.
link of the CRUD: https://www.youtube.com/watch?v=Ue_dIKOMcb4&t=1009s
But I don't think it come from the project because I can't even initialize Firebase in the default flutter counter new application.
And in my index.HTML, in the firebase config paragraph, my API key is underlined in RED
Maybe I use the wrong methode to initialize Firebase fuctions in my project, so please can someone show me how to do.
Here's my
pubspec.yaml
:name: flutter_web_diary description: A new Flutter project. version: 1.0.0+1 environment: sdk: ">=2.6.0 <3.0.0" dependencies: flutter: sdk: flutter provider: ^4.0.4 firebase_core: "^1.7.0" cloud_firestore: "^2.5.3" cupertino_icons: ^0.1.2 dev_dependencies: flutter_test: sdk: flutter flutter: uses-material-design: true
My
idex.HTML
:<!DOCTYPE html> <html lang="en"> <head> <!-- If you are serving your web app in a path other than the root, change the href value below to reflect the base path you are serving from. The path provided below has to start and end with a slash "/" in order for it to work correctly. For more details: * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base This is a placeholder for base href that will be replaced by the value of the `--base-href` argument provided to `flutter build`. --> <base href="$FLUTTER_BASE_HREF"> <meta charset="UTF-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="description" content="A new Flutter project."> <!-- iOS meta tags & icons --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="flutter_application_1"> <link rel="apple-touch-icon" href="icons/Icon-192.png"> <title>flutter_application_1</title> <link rel="manifest" href="manifest.json"> </head> <body> <script> import { initializeApp } from "firebase/app"; import { } from "https://www.gstatic.com/firebasejs/9.1.3/firebase-app.js" import { } from "https://www.gstatic.com/firebasejs/9.1.3/firebase-firestore.js" // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries // Your web app's Firebase configuration const firebaseConfig = { apiKey: "...", authDomain: "...", databaseURL: "...", projectId: "...", storageBucket: "...", messagingSenderId: "...", appId: "..." }; // Initialize Firebase const app = initializeApp(firebaseConfig); // Initialize Firebase firebase.initializeApp(firebaseConfig); var serviceWorkerVersion = null; var scriptLoaded = false; function loadMainDartJs() { if (scriptLoaded) { return; } scriptLoaded = true; var scriptTag = document.createElement('script'); scriptTag.src = 'main.dart.js'; scriptTag.type = 'application/javascript'; document.body.append(scriptTag); } if ('serviceWorker' in navigator) { // Service workers are supported. Use them. window.addEventListener('load', function () { // Wait for registration to finish before dropping the <script> tag. // Otherwise, the browser will load the script multiple times, // potentially different versions. var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion; navigator.serviceWorker.register(serviceWorkerUrl) .then((reg) => { function waitForActivation(serviceWorker) { serviceWorker.addEventListener('statechange', () => { if (serviceWorker.state == 'activated') { console.log('Installed new service worker.'); loadMainDartJs(); } }); } if (!reg.active && (reg.installing || reg.waiting)) { // No active web worker and we have installed or are installing // one for the first time. Simply wait for it to activate. waitForActivation(reg.installing || reg.waiting); } else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) { // When the app updates the serviceWorkerVersion changes, so we // need to ask the service worker to update. console.log('New service worker available.'); reg.update(); waitForActivation(reg.installing); } else { // Existing service worker is still good. console.log('Loading app from service worker.'); loadMainDartJs(); } }); // If service worker doesn't succeed in a reasonable amount of time, // fallback to plaint <script> tag. setTimeout(() => { if (!scriptLoaded) { console.warn( 'Failed to load app from service worker. Falling back to plain <script> tag.', ); loadMainDartJs(); } }, 4000); }); } else { // Service workers not supported. Just drop the <script> tag. loadMainDartJs(); } </script> </body> </html>
and my
main.dart
:import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter_web_diary/diary_card.dart'; import 'package:flutter_web_diary/diary_entry_model.dart'; import 'package:flutter_web_diary/top_bar_title.dart'; import 'package:provider/provider.dart'; import 'diary_entry_page.dart'; // Import the firebase_core plugin import 'package:firebase_core/firebase_core.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); } /// We are using a StatefulWidget such that we only create the [Future] once, /// no matter how many times our widget rebuild. /// If we used a [StatelessWidget], in the event where [App] is rebuilt, that /// would re-initialize FlutterFire and make our application re-enter loading state, /// which is undesired. class App extends StatefulWidget { // Create the initialization Future outside of `build`: @override _AppState createState() => _AppState(); } class _AppState extends State<App> { /// The future is part of the state of our widget. We should not call `initializeApp` /// directly inside [build]. final Future<FirebaseApp> _initialization = Firebase.initializeApp(); @override Widget build(BuildContext context) { return FutureBuilder( // Initialize FlutterFire: future: _initialization, builder: (context, snapshot) { // Check for errors if (snapshot.hasError) { return Text(snapshot.error.toString()); } // Once complete, show your application if (snapshot.connectionState == ConnectionState.done) { return MyApp(); } // Otherwise, show something whilst waiting for initialization to complete return CircularProgressIndicator(); }, ); } } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // Refer to https://firebase.flutter.dev final diaryCollection = FirebaseFirestore.instance.collection('diaries'); final diaryStream = diaryCollection.snapshots().map((snapshot) { return snapshot.docs.map((doc) => DiaryEntry.fromDoc(doc)).toList(); }); return StreamProvider<List<DiaryEntry>>( create: (_) => diaryStream, child: MaterialApp( title: 'My Diary', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.indigo).copyWith(secondary: Colors.pink), ), initialRoute: '/', routes: { '/': (context) => MyHomePage(), '/new-entry': (context) => DiaryEntryPage.add(), }, ), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { final diaryEntries = Provider.of<List<DiaryEntry>>(context); return Scaffold( appBar: AppBar( bottom: PreferredSize( preferredSize: Size.fromHeight(94.0), child: TopBarTitle('Diary Entries'), ), elevation: 0, ), body: Center( child: SizedBox( width: MediaQuery.of(context).size.width * 3 / 5, child: ListView( children: <Widget>[ SizedBox(height: 40), if (diaryEntries != null) for (var diaryData in diaryEntries) DiaryCard(diaryEntry: diaryData), if (diaryEntries == null) Center(child: CircularProgressIndicator()), ], ), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.endTop, floatingActionButton: FloatingActionButton( elevation: 1.5, onPressed: () => Navigator.of(context).pushNamed('/new-entry'), tooltip: 'Add To Do', child: Icon(Icons.add), backgroundColor: Theme.of(context).colorScheme.secondary, ), ); } }
-
Arthur over 2 yearsI checked, but i can't see what i have to change in the code after I imported the package
-
Kaushik Chandru over 2 years