如何为不同的 API 链接配置 Flutter Flavor

Posted

技术标签:

【中文标题】如何为不同的 API 链接配置 Flutter Flavor【英文标题】:How to configure Flutter Flavor for different API links 【发布时间】:2021-09-18 01:25:48 【问题描述】:

我有 3 个用于暂存、开发和生产阶段的不同 API 链接。我尝试以这种方式配置文件以共享链接

//Types of flavors we have
import 'dart:io';

//Types of flavors
enum Flavor 
  STAGING,
  DEVELOPMENT,
  PRODUCTION,


class Config 
  //Floavor is the way to devide application
  //configurations depending on stage we work
  static Flavor? appFlavor;

  // api url for requests depending on the flavor
  // you can use it by typing Config.api_url
  static String get api_url 
    switch (appFlavor) 
      case Flavor.PRODUCTION:
        return 'https://api.Link1';
      case Flavor.DEVELOPMENT:
        return 'https://api.Link2';
      case Flavor.STAGING:
        return 'https://api.Link3';
      default:
        return 'https://api.Link2';
    
  

  //getting information about platform
  //you can use it by typing Config.platform
  static String get platform => Platform.isandroid ? 'ANDROID' : 'ios';

然后我用以下方式在 main.dart 中初始化风味:

void main() 
//Initialising the flavor
  Config.appFlavor = Flavor.PRODUCTION;
  Bloc.observer = AppBlocObserver();
  FlutterError.onError = (details) 
    log(details.exceptionAsString(), stackTrace: details.stack);
  ;

  runZonedGuarded(
    () => runApp(const IChazy()),
    (error, stackTrace) => log(error.toString(), stackTrace: stackTrace),
  );

但是当我尝试将数据传递给 baseURL 的 Chopper 包时,它显示我应该使用 const 值的错误:

import 'package:chopper/chopper.dart';
import 'package:ichazy/config/flavor_config.dart';
//part 'challenges_api_service.chopper.dart';

@ChopperApi(baseUrl: Config.api_url) //Error Appears here
abstract class ChallengeApiService 

错误: 常量变量必须用常量值初始化。 尝试将初始化程序更改为常量表达式。

我知道我应该使用 const 值来取消此错误,但同时我想切换风格和 API 链接。是否有任何适当的方法可以以某种方式管理这两个目标,也许是通过更改 Config 类?

提前谢谢你。

【问题讨论】:

【参考方案1】:

我发现的唯一方法是使用 chopper 包中的自定义创建方法


@ChopperApi(baseUrl: '/')
abstract class ChallengeApiService extends ChopperService 
  @Get()
  Future<Response> getChallenges(
    @Body() Map<String, dynamic> body,
  );

  static ChallengeApiService create() 
    final client = ChopperClient(
        baseUrl: Config.api_url,
        services: [_$ChallengeApiService()],
        converter: JsonConverter());
    return _$ChallengeApiService(client);
  


【讨论】:

以上是关于如何为不同的 API 链接配置 Flutter Flavor的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Firebase 动态链接邀请链接到不同的组

Flutter:如何为 StreamBuilder 制作 http 流

如何为不同的类调用 querySelector? [关闭]

如何为你的 Flutter 项目添加 Kotlin 支持?

如何为 Flutter 添加额外的 iOS 模拟器?

在 Flutter 中,如何为 Card 中的子元素动态分配高度?