Flutter Web使用Retrofit时如何将动态变量作为baseUrl传入
Flutter Retrofit 动态配置baseUrl解决方案
错误原因
Dart 语言中注解属于编译时元数据,所有参数必须是编译时常量,你将运行时才能确定值的apiDomain变量传给@RestApi注解,不符合语法要求,因此抛出常量表达式校验错误。
解决步骤
- 第一步:调整Api接口定义,
@RestApi注解无需传入固定baseUrl,保留生成类构造的可选baseUrl参数:
part 'api_service.g.dart'; // 此处省略baseUrl参数即可 @RestApi() abstract class ApiService { // 构造方法保留baseUrl可选入参,生成代码会自动支持动态赋值 factory ApiService(Dio dio, {String baseUrl}) = _ApiService; // 其余接口定义保持不变 @GET("/user/info") Future<UserInfo> getUserInfo(); }
- 第二步:实例化服务时传入动态获取的环境地址
// 运行时获取的动态域名,支持从全局配置、环境变量、本地配置文件等任意渠道读取 final String runtimeApiDomain = globalWebApiUrl; final dio = Dio(); // 实例化时直接传入动态baseUrl final apiService = ApiService(dio, baseUrl: runtimeApiDomain);
替代实现方案
你也可以直接给Dio实例配置baseUrl,无需在构造ApiService时单独传参:
final dio = Dio(BaseOptions(baseUrl: globalWebApiUrl)); // 此时Retrofit会自动复用Dio配置的baseUrl,无需额外传参 final apiService = ApiService(dio);
内容的提问来源于stack exchange,提问作者Master.Deep
相关产品推荐
相关产品推荐

