首页 > 解决方案 > 如何为不同的 API 链接配置 Flutter Flavor

问题描述

我有 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 类?

先感谢您。

标签: flutterdartenvironmentstaging

解决方案


我发现的唯一方法是在 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);
  }
}


推荐阅读