"NoSuchMethodError: The getter element..." while generating with retrofit_generator

"NoSuchMethodError: The getter element..." while generating with retrofit_generator

颤振 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

Class的错误代码


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。现在让我们找出为什么它为空。 对于 return 类型 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);

在我们看到check for dynamic

if (generic.isDynamic) return null;

在调用 isExactlyType 之后我们得到错误