我的团队正在尝试在Flutter应用中使用Firebase实时数据库。他们更改了pubspec.yaml
和build.gradle
个文件以及链接the google-services.json
文件,如在线教程中所示。然而,教程似乎是矛盾的(在它们之间,甚至与文档之间)。
以下是他们代码的相关部分:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_core/firebase_core.dart';
class ProgramPage extends StatefulWidget {
@override
_ProgramPageState createState() => new _ProgramPageState();
}
class _ProgramPageState extends State<ProgramPage> {
List<Conference> _conferences = List();
DatabaseReference itemRef;
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
static Future<FirebaseApp> _getApp() async {
const FirebaseOptions myOptions = const FirebaseOptions(
googleAppID: '<id>',
apiKey: '<key>',
databaseURL: '<url>',
);
FirebaseApp app;
app = await FirebaseApp.configure(name: "conferences", options: myOptions);
return app;
}
@override
void initState() {
super.initState();
_getApp().then((app) {
final FirebaseDatabase database = new FirebaseDatabase(app: app);
itemRef = database.reference().child('conferences');
itemRef.onChildAdded.listen(_onEntryAdded);
itemRef.onChildChanged.listen(_onEntryChanged);
});
}
_onEntryAdded(Event event) {
setState(() {
_conferences.add(Conference.fromSnapshot(event.snapshot));
});
}
_onEntryChanged(Event event) {
var old = _conferences.singleWhere((entry) {
return entry.id == event.snapshot.key;
});
setState(() {
_conferences[_conferences.indexOf(old)] =
Conference.fromSnapshot(event.snapshot);
});
}
// the build method basically returns a ListView of Conference objects
}
但是当他们在Android模拟器上运行时,他们会遇到以下错误:
W/SyncTree( 7764): Listen at /conferences failed: DatabaseError: Permission denied
E/flutter ( 7764): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7764): Instance of 'DatabaseError'
E/flutter ( 7764): #0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter ( 7764): #1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 7764): #2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter ( 7764): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7764): Instance of 'DatabaseError'
E/flutter ( 7764): #0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter ( 7764): #1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 7764): #2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
你能解释一下我们出了什么问题吗?
编辑:安全规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
编辑2:我们正在使用Santosh Anand的解决方案来简化规则(安全性在这个项目中并不是一个大问题)。现在我们收到这些消息:
W/zygote (14174): Unsupported class loader
W/zygote (14174): Skipping duplicate class check due to unsupported classloader
I/DynamiteModule(14174): Considering local module com.google.android.gms.firebase_database:4 and remote module com.google.android.gms.firebase_database:6
I/DynamiteModule(14174): Selected remote version of com.google.android.gms.firebase_database, version >= 6
W/zygote (14174): Unsupported class loader
W/zygote (14174): Skipping duplicate class check due to unsupported classloader
D/NetworkSecurityConfig(14174): No Network Security Config specified, using platform default
I/zygote (14174): Do partial code cache collection, code=29KB, data=26KB
I/zygote (14174): After code cache collection, code=29KB, data=26KB
I/zygote (14174): Increasing code cache capacity to 128KB
答案 0 :(得分:3)
您必须使用firebase验证您的应用程序。
或
您可以像这样更改安全规则
{
"rules": {
".read": true,
".write": true
}
}
答案 1 :(得分:3)
以下步骤为我解决了这个问题:
1-在创建实时数据库时启用测试模式。
2-将默认数据库设置为实时数据库。
3-在数据库标签中更改规则,如下所示
{
"rules": {
".read": true,
".write": true
}
}
4-从身份验证标签启用匿名登录。
在那之后,直到我使用了“ flutter clean”选项,它才能修复
android studio中的->:转到工具-> Flutter->颤振清除
答案 2 :(得分:1)
void anonymousLogin() {
FirebaseAuth.instance.onAuthStateChanged.listen((user) async {
if (user != null) {
var isAnonymous = user.isAnonymous;
var uid = user.uid;
print(
'In FirestoreServices, isAnonymous = $isAnonymous and uid = $uid');
} else {
FirebaseAuth.instance.signInAnonymously().then((user) {
print(
'In FirestoreServices, isAnonymous = ${user.isAnonymous} and uid = ${user.uid}');
});
}
});
}
在您的主窗口小部件中使用该功能来匿名登录Firebase。确保在Firebase控制台中启用了匿名登录。
答案 3 :(得分:1)
第一个问题:身份验证之前,您正在访问Firebase,保持读写正常运行,但就安全性而言,您的身份验证变得毫无用处。 第二个问题:那是Firebase插件警告,他们正在更新其插件,以确保您使用的是最新版本
答案 4 :(得分:0)
在读取或写入之前,您必须使用firebase验证您的应用程序。
这是auth的flutter插件:firebase_auth:^ 0.16.1
await FirebaseAuth.fromApp(app).signInAnonymously().then((AuthResult val) {
print("USER ID. : " + val.user.uid);
});
您的规则对匿名身份验证是正确的。
{
"rules": {
".write": "auth.uid!==null",
".read": "auth.uid!==null"
}
}
答案 5 :(得分:-2)
我通过此代码创建DatabaseReference对象
itemRef = FirebaseDatabase.instance.reference().child('conferences');
和我一起奔跑。