使用带有Flutter的

时间:2018-06-19 09:02:16

标签: firebase firebase-realtime-database dart flutter

我的团队正在尝试在Flutter应用中使用Firebase实时数据库。他们更改了pubspec.yamlbuild.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

6 个答案:

答案 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)

您必须使用firebase_auth package

登录Firebase
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');

和我一起奔跑。