如何在Flutter应用中连接到本地实时数据库仿真器?

时间:2020-09-26 12:26:21

标签: firebase flutter firebase-realtime-database

我正在为Flutter应用程序使用实时数据库和函数。我已经为数据库和函数设置了本地仿真器,因此我可以在本地测试函数,而无需支付部署成本。现在,我想将Flutter应用程序连接到这些本地仿真器,但是在查找操作方法时遇到了一些麻烦。

FlutterFire文档介绍了如何针对Firestore(https://firebase.flutter.dev/docs/firestore/usage#emulator-usage)而不是针对实时数据库执行此操作。即使我正在使用实时数据库,肯定也必须有一种方法可以连接到仿真器?

我尝试了以下操作:

String host = Platform.isAndroid ? '10.0.2.2:4000' : 'localhost:4000';
    FirebaseDatabase database = FirebaseDatabase(
      app: Firebase.app(),
      databaseURL: host,
    );

但这给了我错误:

未处理的异常:PlatformException(错误,指定了无效的Firebase数据库URL:10.0.2.2:4000,空)

我正在pub上使用firebase_core和firebase_database软件包。

3 个答案:

答案 0 :(得分:1)

根据Android的Firebase文档,使用实时数据库模拟器需要调用database.useEmulator("10.0.2.2", 9000)。快速的search of the FlutterFire code没有显示此类调用,因此看来FlutterFire尚未实现模拟器的使用。

我也找不到open issue,所以您可能要提出功能请求。

答案 1 :(得分:1)

深入研究Firebase Java SDK,我发现.useEmulator()仅设置hostport来创建databaseURL,总之只是重构包装器。

以下代码应与FlutterFire实时数据库软件包一起使用:

String host = Platform.isAndroid ? 'http://10.0.2.2:9000' : 'http://localhost:9000';
FirebaseDatabase database = FirebaseDatabase(
  app: Firebase.app(),
  databaseURL: host,
);

此外,请检查您的firebase.json是否使用正确的端口。数据库的默认值应为9000

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions"
  },
  "storage": {
    "rules": "storage.rules"
  },
  "emulators": {
    "auth": {
      "port": 9099
    },
    "functions": {
      "port": 5001
    },
    "firestore": {
      "port": 8080
    },
    "database": {
      "port": 9000
    },
    
    "ui": {
      "enabled": true
    }
  }
}

答案 2 :(得分:1)

以下代码对我有用。它几乎类似于@Florin Stan 的回答。只是缺少数据库的命名空间。

String host = Platform.isAndroid ? 'http://10.0.2.2:9000' : 'http://localhost:9000';
dbInstance= FirebaseDatabase(
    databaseURL: '$host?ns=YOUR_DATABASE_NAMESPACE',
);

可以在 firebase 实时数据库模拟器 UI 中找到数据库命名空间。