如何在 Flutter 应用程序中连接到本地实时数据库模拟器?

Posted

技术标签:

【中文标题】如何在 Flutter 应用程序中连接到本地实时数据库模拟器?【英文标题】:How do I connect to my local Realtime Database emulator in my Flutter app? 【发布时间】:2021-01-12 14:07:03 【问题描述】:

我正在为我的 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,null)

我在 pub 上使用 firebase_core 和 firebase_database 包。

【问题讨论】:

【参考方案1】:

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

我也找不到open issue,因此您可能需要提交功能请求。

【讨论】:

我明白了。我创建了一个feature request。希望将来会添加。【参考方案2】:

深入研究 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
    
  

【讨论】:

它不适合我。它对你有用吗?【参考方案3】:

以下代码对我有用。它几乎类似于@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 中找到。

【讨论】:

以上是关于如何在 Flutter 应用程序中连接到本地实时数据库模拟器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VB.net 中连接到本地网络上的 Access 数据库?

无法在我的 Cordova iOS 应用程序中连接到本地 Web 服务器

无法在 Xcode 中连接到本地服务器

在 play 框架中连接到本地 h2 数据库

如何从我的 Amazon EC2 实例中连接到 Amazon Redshift 集群

在 C# 中连接到 MySql 数据库