flutter-为flutter项目创建不同环境,实现ios/Android原生/flutter自动更改包名:Bundle id 、网络环境等

最终效果

  1. flutter端,打开flutter项目,会看到以下三个自定义的选项:
    在这里插入图片描述

  2. 安卓端,打开对应的安卓项目(即打开android文件夹), 会看到Build Variants下,app有多个环境可选, 分别是test环境的profile、release、debug版; dev环境的profile、release、debug版 和 prod环境的profile、release、debug版
    在这里插入图片描述

  3. iOS端,用xcode打开对应的ios项目,即打开ios文件夹下的Runner.xcworkspace,可以看到3个Scheme…, 每个Scheme各个版(debug、profile、release)都可以配置不同的bundle id, app name、等

在这里插入图片描述在这里插入图片描述

开始

这里我为项目添加了3个环境,dev、test和prod,三个环境所用的接口、项目名称、包名、icon不一致

用flutter打开项目,点击如下所示的Edit Configurations,创建3个name分别为dev、test、prod, flavor分别为dev、check、prod; (由于test在安卓不能设置为flavor的值,所以这里改成check)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为安卓配置环境

在android/app/build.gradle 下添加如下代码:

flavorDimensions "appEnvironment"
productFlavors {
check {
            dimension "appEnvironment"
        }

        prod {
            dimension "appEnvironment"
        }

        dev {
            dimension "appEnvironment"
        }
    }

目前这里还未设置任何根据环境改变的值,这样就配置好了安卓端的多flavor, 如果要添加包名,项目名等, 就可以在这里设置了,关于更多设置可以网络搜索gradle 配置多渠道,

用安卓打开该项目,就可以看到如下: 在安卓端就可以利用他来实现多环境配置了,接下来配置ios的,都配置好了,再设置具体变量
在这里插入图片描述
这个时候执行flutter build apk 是会报错的,如果没有报错,需要执行flutter clean一下,错误如下:
在这里插入图片描述
观察该项目build目录下的build/app/outputs/flutter-apk/可以看到会有好几个apk,分别是app-check-release.apk, app-check-release.apk和app-prod-release.apk;

报错原因: 这是因为flutter build apk会把所有的flavor包都生成, (flutter build apk 不知道版本情况下是默认生成release版本的),所以会看到这3个版本, 但是生成之后,他却不知道用哪个了,所以报错

解决办法: flutter build apk --flavor dev/check/prod 指定环境;

为iOS配置环境

  1. 添加scheme, 名称分别为dev、check、prod
    在这里插入图片描述
    在这里插入图片描述

  2. 添加完成可以看到如下:
    在这里插入图片描述

  3. 选中PROJECT下的info,找到configurations选择,点击+号, 分别Duplicate 3份 Debug、Release、Profile, 复制之后给每个版的3分更改名称分别为check、dev、prod
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 之后就可以为每个configurations配置单独的bundle id、证书、签名等信息
    在这里插入图片描述
    在这里插入图片描述

  5. 我这里没有更改 bundle id,只是为debug环境和release环境配置了不同的签名,所以最后看到的效果如下:
    在这里插入图片描述

  6. 除此之外,Podfile还需要更改如下位置: 在这里插入图片描述
    更改后为:
    在这里插入图片描述
    此时可以删掉原来默认的runner的scheme, 和Debug、Profile、Release三个默认configurations

之后执行pod install, 就会看到, Pod的PROJECT下的info多出了如下内容:
在这里插入图片描述
以上,ios和安卓配置多环境就完成了,接下来就是利用多环境实现自定义需求了,比如更改请求api,更改包名

从flutter端获取当前环境

ios端

在info.plist 文件添加一条key为Flavor, value为$(PRODUCT_FLAVOR),如下:
在这里插入图片描述
之后来到Runner下的Build Setting, 选择Add User-Defined Setting,
在这里插入图片描述
为每个configuration添加值
在这里插入图片描述
写一个channel, 以供flutter方获取ios的flavor值

打开appdelegate,添加如下代码, 我这里是swift语言,用oc语言的,翻译成oc语言就可以
在这里插入图片描述

let channelName = "flavor"
    let rootViewController : FlutterViewController = window?.rootViewController as! FlutterViewController
    let methodChannel = FlutterMethodChannel(name: channelName, binaryMessenger: rootViewController as! FlutterBinaryMessenger)
    
    methodChannel.setMethodCallHandler {(call: FlutterMethodCall, result: FlutterResult) -> Void in
        result(Bundle.main.infoDictionary?["Flavor"])
    }

安卓端

在mainActivity里添加如下代码
在这里插入图片描述

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "flavor").setMethodCallHandler { call, result ->  result.success(BuildConfig.FLAVOR) }

这里说明一个BuildConfig,这个文件,在选择了flavor后,会自动生成,这里只需要引用一下就可以,
在这里插入图片描述

flutter端通过channel读取环境

在这里插入图片描述

const MethodChannel('flavor')
      .invokeMethod<String>('getFlavor')
      .then((String flavor) {

    print('STARTED WITH FLAVOR $flavor');
    if (flavor == 'prod') {
       
    } else if (flavor == 'check') {
       
    } else if (flavor == 'dev') {
       
    }

  }).catchError((error) {
    print(error);
    print('FAILED TO LOAD FLAVOR');
  });

这样就拿到了当前运行环境,flutter也可以设置自己的一些设置

以上,就完成了,之后运行打包,只要选择对应configuration就可以,命令行需要指定flavor, 比如: 和

flutter build apk --flavor dev 
flutter build ios --flavor dev

更多资料 配置 flavors 构建双端
博客地址: csdn
GitHub: flutter_muti_env

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
如果你的Flutter项目是在创建时未引入某个平台的,比如在创建项目时未引入Android平台,那么你可以按照以下步骤在Android Studio中添加Android平台: 1. 打开你的Flutter项目,在顶部菜单栏中选择`File` -> `New` -> `New Module`。 2. 在弹出的对话框中选择`Android Library`,然后点击`Next`。 3. 在下一个界面中输入你的Android库的名称,比如`flutter_android`,然后点击`Finish`。 4. 在Android Studio的左侧面板中,展开`Project`视图,可以看到刚刚创建的`flutter_android`库。 5. 打开`flutter_android`库的`build.gradle`文件,在其中添加以下代码: ``` apply plugin: 'com.android.library' android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 16 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { minifyEnabled false shrinkResources false } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } ``` 注意修改`compileSdkVersion`和`targetSdkVersion`为你想要的版本。 6. 在Android Studio的左侧面板中,展开你的Flutter项目,打开`android`目录下的`settings.gradle`文件,在最后添加以下代码: ``` include ':app' setBinding(new Binding([gradle: this])) evaluate(new File( settingsDir.parentFile, 'flutter_android/include_flutter.groovy' )) ``` 7. 在`android`目录下创建一个名为`include_flutter.groovy`的文件,并添加以下代码: ``` def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() def plugins = new Properties() def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') if (pluginsFile.exists()) { pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } } plugins.each { name, path -> def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() include ":$name" project(":$name").projectDir = pluginDirectory } ``` 8. 在Android Studio的顶部菜单栏中选择`File` -> `Sync Project with Gradle Files`,等待同步完成。 9. 现在你就可以在你的Flutter项目中使用Android平台了。可以在Flutter项目中添加以下代码测试一下: ``` import android.os.Bundle; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.android.FlutterFragmentActivity; public class MainActivity extends FlutterFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` 这是一个简单的Android Activity类,可以在Flutter项目中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值