firebase - 如何在 Flutter Web 应用程序中将 Firebase.dart 与 Firebase Emulators FireStore db 一起使用?
问题描述
我的应用是 Flutter Web 应用。它使用package:firebase/firebase.dart。
我正在尝试使用 Firebase 模拟器 UI。
该应用程序托管在 Firebase 上,并可以读取和写入 Firestore。但是当我使用firebase emulators:start
本地托管的应用程序时localhost:5000
仍在访问生产 Firestore 数据库。
如何进行设置,以便本地运行的应用程序使用 Firestore 模拟器localhost:8080
?
我找到了这样的线程,但我没有使用cloud_firestore.dart
. 我尝试了类似的步骤(请参阅下面的更新),但它们在我的上下文中不起作用。
这是我的main.dart
文件:
import 'package:algolia/algolia.dart';
import 'package:firebase/firebase.dart' as fb;
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:web_flutter/data/repository.dart';
import 'package:web_flutter/pages/auth/login.dart';
import 'package:web_flutter/pages/home/home_page.dart';
import 'package:web_flutter/services/authentication.dart';
Future<void> main() async {
try {
var app = fb.initializeApp(
apiKey: 'someAPIkey',
authDomain: 'some.domain.com',
databaseURL: 'https://somedomain.firebaseio.com',
projectId: 'myProj',
storageBucket: '',
messagingSenderId: 'someId',
appId: '1:9anAppId');
var searchClient = Algolia.init(
applicationId: 'anAppId',
apiKey: 'someAPIkey');
runApp(MyApp(
repository: Repository(app.firestore(), searchClient),
authentication: Authentication(app.auth())));
} on fb.FirebaseJsNotLoadedException catch (e) {
print(e);
}
}
class MyApp extends StatefulWidget {
final Repository repository;
final Authentication authentication;
const MyApp({Key key, this.authentication, this.repository})
: super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
有什么想法吗?
谢谢!
更新:我尝试了以下但得到相同的结果:
import 'package:algolia/algolia.dart';
import 'package:firebase/firebase.dart' as fb;
import 'package:firebase/src/firestore.dart' as fs;
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:web_flutter/data/repository.dart';
import 'package:web_flutter/pages/auth/login.dart';
import 'package:web_flutter/pages/home/home_page.dart';
import 'package:web_flutter/services/authentication.dart';
Future<void> main() async {
try {
var app = fb.initializeApp(
apiKey: 'someAPIkey',
authDomain: 'some.domain.com',
databaseURL: 'https://somedomain.firebaseio.com',
projectId: 'myProj',
storageBucket: '',
messagingSenderId: 'someId',
appId: '1:9anAppId');
var searchClient = Algolia.init(
applicationId: 'anAppId',
apiKey: 'someAPIkey');
// These two lines are new:
var db = app.firestore();
db.settings(fs.Settings(host: 'localhost:8080', ssl: false));
runApp(MyApp(
repository: Repository(db, searchClient),
authentication: Authentication(app.auth())));
} on fb.FirebaseJsNotLoadedException catch (e) {
print(e);
}
}
解决方案
关键是导入dart:html
让我可以访问window
. 从那里我可以做一些类似于 Firebase 文档中使用的 JavaScript 的事情。
import 'dart:html';
import 'package:algolia/algolia.dart';
import 'package:firebase/firebase.dart' as fb;
import 'package:firebase/firestore.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:web_flutter/data/repository.dart';
import 'package:web_flutter/pages/auth/login.dart';
import 'package:web_flutter/pages/home/home_page.dart';
import 'package:web_flutter/services/authentication.dart';
Future<void> main() async {
try {
var app = fb.initializeApp(firebaseConfig);
if (window.location.hostname == 'localhost') {
app.firestore().settings(Settings(
host: '0.0.0.0:8080',
ssl: false,
));
}
我不知道主持人是否0.0.0.0
适合所有情况下的所有人。我是从模拟器启动时列出的主机那里得到的。
推荐阅读
- windbg - 如何摆脱符号文件相关的警告/错误消息
- docker-compose - 如何使用 Rancher v2 生成 docker-compose.yml?
- spotfire - HH:mi:ss 数据上的聚合“总和”
- python - 从熊猫数据框中删除停用词
- logging - 显示包含控制字符的文本文件的最终外观
- angular - 如何将表格的主体移动到另一个组件中,这样它就不会破坏样式
- linux - 所有用户在脚本内执行 cupsenable 而不提示输入密码
- java - 在 websphere 8.5.5.14 中启动我的应用程序时出现异常
- python - 在 python 中制作一个 keras 模型的深拷贝
- ios - 如何禁用地铁捆绑器“自动弹出”