![](/img/trans.png)
[英]Why am I getting a NameError when trying to call my Javascript array in a template?
[英]Why am I getting an error when trying to call a method with flutter chopper and built value?
我得到以下錯誤,我相信這是因為空安全,這意味着沒有收到數據或 getSignedInUser() 方法不正確或類BuiltValueConverter是原因。
(我用郵遞員測試了令牌並檢索了數據)
E/flutter (21792): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] 未處理的異常:未處理的錯誤 Null 檢查運算符用於“AuthBloc”實例中的空值。 E/顫振(21792):#0
BuiltValueConverter._deserialize package:todo_list_app/…/auth/built_value_converter.dart:51 E/flutter (21792): #1 BuiltValueConverter._convertToCustomObject package:todo_list_app/…/auth/built_value_converter.dart:36 E/flutter (21792):2 BuiltValueConverter.convertResponse 包:todo_list_app/…/auth/built_value_converter.dart:25
我正在使用帶有built_value Pubs 的chopper。 我正在嘗試將即將到來的 json 轉換為對象。 例子:
{ "userName": "Jack", "email": "jack2066@gmail.com", "userRole": "USER", "created_at": "2021-07-03T16:49:56.774Z", "updated_at": “2021-07-03T16:49:56.774Z” }
在本教程轉換器和內置值集成中也解釋了錯誤開始的以下代碼
import 'package:built_collection/built_collection.dart';
import 'package:chopper/chopper.dart';
import 'package:todo_list_app/infrastructure/remote/auth/models/serializers.dart';
class BuiltValueConverter extends JsonConverter {
@override
Request convertRequest(Request request) {
return super.convertRequest(
request.copyWith(
body: serializers.serializeWith(
serializers.serializerForType(request.body.runtimeType)!,
request.body,
),
),
);
}
@override
Response<BodyType> convertResponse<BodyType, SingleItemType>(
Response response,
) {
final Response dynamicResponse = super.convertResponse(response);
final BodyType customBody =
_convertToCustomObject<SingleItemType>(dynamicResponse.body);//
return dynamicResponse.copyWith<BodyType>(body: customBody);
}
dynamic _convertToCustomObject<SingleItemType>(dynamic element) {
if (element is SingleItemType) return element;
if (element is List)
return _deserializeListOf<SingleItemType>(element);
else
return _deserialize<SingleItemType>(element);
}
BuiltList<SingleItemType> _deserializeListOf<SingleItemType>(
List dynamicList,
) {
// Make a BuiltList holding individual custom objects
return BuiltList<SingleItemType>(
dynamicList.map((element) => _deserialize<SingleItemType>(element)),
);
}
SingleItemType _deserialize<SingleItemType>(Map<String, dynamic> value,) {
// We have a type parameter for the BuiltValue type, which should be returned after deserialization.
return serializers.deserializeWith(
serializers.serializerForType(SingleItemType)!, // Error Start
value,
);
}
}
這是我的 Chopper 服務代碼, getSignedInUser拋出錯誤。 不知道getSignedInUser方法的實現是否正確。
import 'package:chopper/chopper.dart';
import 'package:injectable/injectable.dart';
import 'package:todo_list_app/infrastructure/remote/auth/built_value_converter.dart';
import 'package:todo_list_app/infrastructure/remote/auth/models/auth_built_model.dart';
import 'package:todo_list_app/infrastructure/remote/core/constants.dart';
part 'auth_service.chopper.dart';
@singleton
@ChopperApi()
abstract class AuthService extends ChopperService {
@factoryMethod
static AuthService create() {
final client = ChopperClient(
baseUrl: AUTH_BASE_URL_External,
services: [
_$AuthService(),
],
converter: BuiltValueConverter(),
errorConverter: JsonConverter(),
interceptors: [
HttpLoggingInterceptor()
],
);
return _$AuthService(client);
}
@Post(path: '/signup')
Future<Response> signUp(@Body() RegisterRequestModel body);
@Post(path: '/signin')
Future<Response<LoginResponseModel>> singIn(@Body() LoginRequestModel body);
//headers: {AUTH_HEADER:BEARER+'authValue'}
@Get(path: '/auth', )//authValue='Bearer Token'
Future<Response<UserResponseModel>> getSignedInUser(@Header("Authorization") String authValue);//error Unhandled error Null check operator used on a null value
}
知道如何解決這個錯誤嗎? 是否還有 Chopper 的良好文檔或具有良好文檔的替代酒吧? 謝謝
是的,正如你所說,這是因為空安全。 您的_deserialize
返回一個非空值,而serializers.deserializeWith
可以返回一個空值。 您可以將返回類型更改為可為空,或者處理serializers.deserializeWith
的空情況。 如果你願意,你可以使用下面的BuiltValueConverter
。 它來自他們給出的示例,該示例是通用的,並進行了細微的更改。
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:chopper/chopper.dart';
import 'package:graphical_representation/app/serializers.dart';
class BuiltValueConverter extends JsonConverter {
T? _deserialize<T>(dynamic value) => serializers.deserializeWith<T>(
(serializers.serializerForType(T) as Serializer<T>),
value,
);
BuiltList<T> _deserializeListOf<T>(Iterable value) => BuiltList(
value.map((value) => _deserialize<T>(value)).toList(growable: false),
);
dynamic _decode<T>(entity) {
/// handle case when we want to access to Map<String, dynamic> directly
/// getResource or getMapResource
/// Avoid dynamic or unconverted value, this could lead to several issues
if (entity is T) return entity;
try {
if (entity is List) return _deserializeListOf<T>(entity);
return _deserialize<T>(entity);
} catch (e) {
print(e);
return null;
}
}
@override
Response<ResultType> convertResponse<ResultType, Item>(Response response) {
// use [JsonConverter] to decode json
final jsonRes = super.convertResponse(response);
final body = _decode<Item>(jsonRes.body);
return jsonRes.copyWith<ResultType>(body: body);
}
@override
Request convertRequest(Request request) => super.convertRequest(
request.copyWith(
body: serializers.serialize(request.body),
),
);
}
我認為您的“serelizers.dart”文件中缺少值,應該如下所示:
@SerializersFor(const[RegisterRequestModel,LoginRequestModel,UserResponseModel])
final Serializers serializers =
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.