开发者社区 问答 正文

有没有一种干净的方法可以让Android在颤振代码中生成特定的信息?

我正在使用Java将构建在Android上的应用程序迁移到使用Fltter+Dart的过程中。

就像我现在的应用程序,我增加了2种构建类型-release和debug在build.gradle档案。我正在指定在这些构建类型中使用的不同的ServerAPI URL。

示例BuildType信息-

    release {
        manifestPlaceholders = [hostName: "PROD SERVER", "version": "v1"]
    }
    debug {
        manifestPlaceholders = [hostName: "STAGE SERVER", "version": "v1"]
    }

}

在本地的android中,我可以使用android.content.pm.ApplicationInfo和android.os.Bundle若要获取代码中的信息以动态使用基本URL,请执行以下操作。

我的本地应用程序中的示例代码如下所示:

  ApplicationInfo app = this.getPackageManager()
      .getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA);
  Bundle bundle = app.metaData;
  API_HOST = bundle.getString("api.host");
  API_VERSION = bundle.getString("api.version");

有没有一个颤振+飞镖的替代方案? 我一直在阅读,解决的方法似乎是创建多个主文件,然后使用适当的文件构建Production/dev应用程序。

展开
收起
游客5akardh5cojhg 2019-12-06 14:28:25 379 分享 版权
阿里云 AI 助理回答

在Flutter中,处理不同构建类型(如debug和release)的配置与原生Android或iOS有所不同。Flutter推荐使用环境变量和配置文件来管理这些差异,而不是直接在Dart代码中读取元数据。

使用flutter_dotenv

一个常用的方法是使用flutter_dotenv包,它允许你根据环境从.env文件加载不同的配置。首先,你需要将此包添加到你的pubspec.yaml文件中:

dependencies:
  flutter_dotenv: ^5.0.1

接下来,按照以下步骤操作:

  1. 创建环境特定的.env文件:在项目根目录下,为每个环境创建一个.env文件,例如.env.dev.env.prod。在这些文件中,你可以定义环境变量,如:

    • .env.dev:
      API_HOST=STAGE_SERVER
      API_VERSION=v1
      
    • .env.prod:
      API_HOST=PROD_SERVER
      API_VERSION=v1
      
  2. 配置Flutter以使用正确的.env文件:在你的pubspec.yaml中,利用flutter_dotenv的配置来指定默认的.env文件以及如何根据构建类型选择文件。你可以在flutter_dotenv的文档中找到如何根据构建类型动态选择.env文件的示例,但通常这需要在你的构建脚本中进行一些自定义逻辑,或者手动控制在开发和生产环境中使用哪个文件。

  3. 在Dart代码中使用环境变量:通过flutter_dotenv加载环境变量后,你可以在整个应用中轻松地访问它们。

import 'package:flutter_dotenv/flutter_dotenv.dart';

void main() async {
  await dotenv.load();
  String apiHost = dotenv.get('API_HOST');
  String apiVersion = dotenv.get('API_VERSION');

  // 确保获取到了值
  assert(apiHost != null && apiVersion != null);

  runApp(MyApp(apiHost, apiVersion));
}

自定义构建配置

对于更复杂的场景,你可能需要在Flutter项目的pubspec.yaml中利用build_config包来自动生成Dart配置类,该类可以根据当前的构建类型提供不同的值。这要求你在构建过程中做一些额外的配置,但它提供了高度的灵活性。

总结

虽然Flutter没有直接等同于Android原生的ApplicationInfoBundle方法来动态获取元数据,但通过上述方法,你可以有效地管理不同构建类型的配置信息。flutter_dotenv是一个简单且广泛使用的解决方案,适合大多数场景。对于更高级的需求,考虑结合使用build_config或其他自定义构建脚本策略。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答