我已经使用命令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中呢?
谢谢
答案 0 :(得分:0)
通过firebase functions:config:set
设置的配置变量(如命令所示)仅在Cloud Functions中可用。它们不会以任何方式通过此命令传播到客户端应用程序。通常,这将是一种反模式,因为此类配置变量通常用于保留受信任的凭据。
如果您有一个用例,该值也需要在客户端应用程序中可用,则有几种方法可以做到这一点:
创建一个附加的Cloud Functions端点,您可以在其中公开配置变量的值。通常,这将是HTTPS或Callable函数,然后您可以从客户端代码中调用它。
将值推送到另一个位置,您的应用程序代码可在调用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
部署我更新的托管和函数。