Reputation: 21
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,
),
);
}
}
Upvotes: 2
Views: 652
Reputation: 21
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.
Upvotes: 0
Reputation: 17792
For firebase in web there is a different package. Please check this one Firebase_core_web
Upvotes: 3