Flutter 1.17.3
retrofit_generator: ^1.3.7
我运行此命令
flutter pub run build_runner build --delete-conflicting-outputs
并且在生成过程中收到以下错误
[SEVERE] retrofit_generator:retrofit on lib/data_services/calendar/repository/calendar_network_repository.dart:
Error running RetrofitGenerator
NoSuchMethodError: The getter 'element' was called on null.
Receiver: null
Tried calling: element
发生错误的类的代码
part 'calendar_network_repository.g.dart';
@RestApi(baseUrl: Url.profiles)
abstract class CalendarNetworkRepository {
factory CalendarNetworkRepository(Dio dio, {String baseUrl}) = _CalendarNetworkRepository;
@GET('/{userId}/diary')
Future<List<dynamic>> getData(
@Path('userId') int userId, @Query('start') String startDate, @Query('end') String endDate);
}
TLDR
不要在将由Retrofit_generator生成的方法的签名中使用dynamic
由于使用了dynamic
,因此生成失败
Future<List<dynamic>> getData
此错误发生在source_gen的type_checker
bool isExactlyType(DartType staticType) => isExactly(staticType.element);
因为据我们所知staticType == null
。现在让我们找出为什么它为空。对于返回类型,例如Future<List<SomeType>>
retrofit_generator必须生成code for transformation映射到SomeType实例
blocks.add(Code("var value = $_resultVar.data.map((dynamic i) => $innerReturnType.fromJson(i as Map<String,dynamic>)).toList();"));
让我们看看如何声明innerReturnType
final innerReturnType = _getResponseInnerType(returnType);
if (generic.isDynamic) return null;
此isExactlyType
被调用后,我们得到错误