Flutter Firebase配置变量

时间:2019-07-19 21:32:06

标签: firebase flutter dart google-cloud-functions

我已经使用命令firebase functions:config:set algolia.appid="app_id" algolia.apikey="api_key"设置了一些配置变量,但是如何在Flutter应用程序中使用它们?我已经安装了firebase_core

在TypeScript中,您将编写以下内容:

import * as admin from 'firebase-admin';

admin.initializeApp();
const env = functions.config();
console.log(env.algolia.appid);

但是在Dart和Flutter中呢?

谢谢

2 个答案:

答案 0 :(得分:0)

通过firebase functions:config:set设置的配置变量(如命令所示)仅在Cloud Functions中可用。它们不会以任何方式通过此命令传播到客户端应用程序。通常,这将是一种反模式,因为此类配置变量通常用于保留受信任的凭据。

如果您有一个用例,该值也需要在客户端应用程序中可用,则有几种方法可以做到这一点:

  1. 创建一个附加的Cloud Functions端点,您可以在其中公开配置变量的值。通常,这将是HTTPS或Callable函数,然后您可以从客户端代码中调用它。

  2. 将值推送到另一个位置,您的应用程序代码可在调用firebase functions:config:set的同时从中读取该值。这可能是您应用程序的配置文件,甚至可能是您生成的.dart文件。

答案 1 :(得分:0)

我也遇到了这个问题,发现自己在这个 S.O.线。我尝试按照上面 Frank van Puffelen 的建议进行操作。

functions/.runtimeconfig.json中:

{
  "algolia": {
    "appid": "ID",
    "apikey": "KEY"
  },
  "webmerge": {
    "key": "KEY",
    "secret": "SECRET",
    "stashkey": "STASH_KEY"
  },
}

functions/index.ts中:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
. . .

const cors = require('cors')({origin: true})
const envObj = functions.config()

. . .

export const getEnv = functions.https.onRequest((req, resp) => {
  cors(req, resp, () => resp.status(200).send(JSON.stringify(envObj)));
});

. . .

注意:在本地工作时,我使用 cors 包来解决 CORS 错误。当 localhost:5000(模拟器托管)调用 localhost:5001(模拟器函数)时,我会收到这些错误。

web_flutter/main.dart中:

Future<Map<String, dynamic>> fetchEnv(String functionsURL) async {
  var response = await http.get('${functionsURL}/getEnv');
  return json.decode(response.body);
}

Future<void> main() async {
  try {
    var functionsURL = 'FUNCTIONS_URL';
    var app = fb.initializeApp(firebase app details);
    if (window.location.hostname == 'localhost') {
      app.firestore().settings(Settings(
            host: 'localhost:8080',
            ssl: false,
          ));
      functionsURL = 'http://localhost:5001';
    }

    var env = await fetchEnv(functionsURL);

    var searchClient = Algolia.init(
        applicationId: env['algolia']['appid'],
        apiKey: env['algolia']['apikey']);

    runApp(MyApp(
        repository: Repository(app.firestore(), searchClient),
        authentication: Authentication(app.auth())));
  } on fb.FirebaseJsNotLoadedException catch (e) {
    print(e);
  }
}

一旦我确认这可以在本地运行,我就可以使用 firebase functions:config:set 在实时函数环境中设置此数据,并使用 firebase deploy 部署我更新的托管和函数。