Can't link flutter web application to firebase project / infinite loading

154

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

Share:
154
Arthur
Author by

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&amp;Box and in my free time I try to develop experimental games on Unity.

Updated on January 01, 2023

Comments

  • Arthur
    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
    Arthur over 2 years
    I checked, but i can't see what i have to change in the code after I imported the package
  • Kaushik Chandru
    Kaushik Chandru over 2 years