“ NoSuchMethodError:getter元素……”,同时使用Retrofit_generator生成

问题描述 投票:0回答:1

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);
}
flutter dart retrofit
1个回答
0
投票

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);

我们看到check for dynamic

if (generic.isDynamic) return null;

isExactlyType被调用后,我们得到错误

© www.soinside.com 2019 - 2024. All rights reserved.