【问题标题】:Flutter Firebase Config VariablesFlutter Firebase 配置变量
【发布时间】:2025-12-07 05:25:01
【问题描述】:

我已经使用命令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 中呢?

谢谢

【问题讨论】:

  • 你想用什么? Firestore DB 还是其他?
  • 使用阿尔戈利亚。 Firestore 配置不会以这种方式完成。

标签: firebase flutter dart google-cloud-functions


【解决方案1】:

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

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

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

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

【讨论】:

  • 在这种情况下,我是否只需将 appID 和 APIkey 硬编码到我的应用程序中并将它们也提交到 Github?显然不建议这样做,所以我想知道解决方法是什么。
  • 这取决于:如果 API 密钥是保密的,那么您根本不应该在客户端中使用它。
  • 感谢您的回复。它们是保密的,所以这就是为什么我不想将任何东西硬编码到客户端中。不确定如何在 Flutter 中使用 API 密钥。
  • 如果你想让它们保密,这不仅仅是在代码中不包含它们,而是根本不从客户端使用它们。在这种情况下,您通常希望在服务器端代码中隔离需要密钥的功能,只有您可以看到它们,将该代码公开为您的应用可以调用的自定义 API,并保护对该自定义 API 的访问.
【解决方案2】:

我也遇到了这个问题,发现自己在这个 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 部署我更新的托管和函数。

【讨论】: