#flutter #object #dart #null #dio
Вопрос:
Есть проект, который открывается без каких-либо ошибок на первом ПК, а на втором тот же проект, та же версия flutter, те же зависимости, но возвращает эту ошибку:
PlaceHolderClient.login(phoneNumber: 7 708 819 1447)
I/flutter ( 4094): PlaceHolderClient.login(phoneNumber: 7 708 819 1447) => NetworkError.request(error: DioError [DioErrorType.other]: type 'Null' is not a subtype of type 'Object'
I/flutter ( 4094): #0 DefaultHttpClientAdapter.fetch.<anonymous closure>
package:dio/…/adapters/io_adapter.dart:55
I/flutter ( 4094): #1 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:400:8)
I/flutter ( 4094): #2 DefaultHttpClientAdapter.fetch
package:dio/…/adapters/io_adapter.dart:55
I/flutter ( 4094): <asynchronous suspension>
I/flutter ( 4094): #3 DioMixin._dispatchRequest
package:dio/src/dio_mixin.dart:632
I/flutter ( 4094): <asynchronous suspension>
I/flutter ( 4094): #4 DioMixin.fetch.<anonymous closure>.<anonymous closure> (package:dio/src/dio_mixin.dart)
package:dio/src/dio_mixin.dart:1
I/flutter ( 4094): <asynchronous suspension>
I/flutter ( 4094): )
I/flutter ( 4094): type 'Null' is not a subtype of type 'Object'
E/flutter ( 4094): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
Я попробовал обновление flutter, понижение уровня flutter vx.x.x
(пример v2.5.0)
Это мой код: AuthService
class AuthService {
Future<Result<LoginResponseModel, NetworkError>> loginOrRegister({
required String phoneNumber,
}) async {
return NetworkExecuter.execute<LoginResponseModel, LoginResponseModel>(
route: PlaceHolderClient.login(' 7 ' phoneNumber),
responseType: LoginResponseModel(),
);
}}
Сетевой исполнитель
class NetworkExecuter {
static UserData _userData = UserData();
static bool debugMode = true;
static showAlert(BuildContext? context, DioError error) {
return showDialogCustom(
context: context!,
barrierDismissible: true,
backgroundColor: Colors.black26,
title: 'Ошибка',
child: Container(
padding: EdgeInsets.all(20),
child: Center(
child: Text(
"${error.response!.data["message"]}",
textAlign: TextAlign.center,
),
),
),
);
}
static void handleError(DioError error, BuildContext buildContext) {
print(error.message);
switch (error.response!.statusCode) {
case 402:
_userData.setActivationRequired(true);
Navigator.pushAndRemoveUntil(
GlobalVariable.navState.currentContext!,
MaterialPageRoute(
builder: (context) => ActivationScreen(),
),
(route) => false,
);
print("Payment required");
break;
case 403:
showAlert(GlobalVariable.navState.currentContext!, error);
break;
case 422:
// showAlert(GlobalVariable.navState.currentContext!, error);
print("The data you have provided is invalid.");
break;
case 401:
_userData.deleteToken();
Navigator.pushAndRemoveUntil(
GlobalVariable.navState.currentContext!,
MaterialPageRoute(
builder: (context) => LoginScreen(),
),
(route) => false,
);
print("Unauthorized");
break;
case 404:
showAlert(GlobalVariable.navState.currentContext!, error);
print("Request not found.");
break;
case 500:
showDialogCustom(
context: GlobalVariable.navState.currentContext!,
barrierDismissible: true,
backgroundColor: Colors.black26,
title: 'Ошибка',
child: Container(
padding: EdgeInsets.all(20),
child: Center(
child: Text(
"Что то пошло не так c нашими серверами, свяжитесь с администратором чтобы проблема решилась быстрее!",
textAlign: TextAlign.center,
),
),
),
);
print(
"There is something wrong with our servers, please report to the admin so it gets fixed.");
break;
default:
showDialogCustom(
context: GlobalVariable.navState.currentContext!,
barrierDismissible: true,
backgroundColor: Colors.black26,
title: 'Ошибка',
child: Container(
padding: EdgeInsets.all(20),
child: Center(
child: Text(
"Что то пошло не так!",
textAlign: TextAlign.center,
),
),
),
);
print("Something went wrong.");
}
}
static Future<Result<K, NetworkError>> execute<T extends BaseNetworkModel, K>(
{required BaseClientGenerator route,
T? responseType,
NetworkOptions? options}) async {
if (debugMode) print(route);
// Check Network Connectivity
if (await NetworkConnectivity.status) {
try {
var response =
await NetworkCreator.shared.request(route: route, options: options);
if (responseType != null) {
var data = NetworkDecoder.shared
.decode<T, K>(response: response, responseType: responseType);
return Result.success(data);
} else {
return Result.success('' as K);
}
// NETWORK ERROR
} on DioError catch (diorError) {
if (debugMode)
print("$route => ${NetworkError.request(error: diorError)}");
handleError(diorError, GlobalVariable.navState.currentContext!);
return Result.failure(NetworkError.request(error: diorError));
// TYPE ERROR
} on TypeError catch (e) {
if (debugMode)
print("$route => ${NetworkError.type(error: e.toString())}");
return Result.failure(NetworkError.type(error: e.toString()));
}
// No Internet Connection
} else {
if (debugMode)
print(NetworkError.connectivity(message: 'No Internet Connection'));
showCustomSnackBar(
context: GlobalVariable.navState.currentContext!,
message: 'Интернет подключение отсутсвует');
return Result.failure(
NetworkError.connectivity(message: 'No Internet Connection'));
}
}
}
Network Creator
class NetworkCreator {
static var shared = NetworkCreator();
Dio _client = Dio();
Future<Response> request(
{required BaseClientGenerator route, NetworkOptions? options}) async {
return _client.fetch(
RequestOptions(
baseUrl: route.baseURL,
method: route.method,
path: route.path,
headers: await route.header,
queryParameters: route.queryParameters,
data: route.body,
sendTimeout: route.sendTimeout,
receiveTimeout: route.sendTimeout,
onReceiveProgress: options?.onReceiveProgress,
validateStatus: (statusCode) => (statusCode! >= HttpStatus.ok amp;amp;
statusCode <= HttpStatus.multipleChoices),
),
);
}
}
@замороженный класс PlaceHolderClient
«запуск flutter pub сборка build_runner-удаление конфликтующих выходов» запущен на втором ПК
@freezed
class PlaceHolderClient extends BaseClientGenerator with _$PlaceHolderClient {
static final UserData _userData = UserData();
// Routes
const PlaceHolderClient._() : super();
const factory PlaceHolderClient.login(String phoneNumber) = _Login;
@override
String get baseURL => "url(its changed)";
@override
String get path {
return this.when<String>(
login: (String phoneNumber) => 'api/auth/login-or-register');
}
@override
String get method {
return this.maybeWhen<String>(
orElse: () => 'GET',
login: (String phoneNumber) => 'POST');
//its post on postman(verified)
}
@override
dynamic get body {
return this.maybeWhen(
login: (String phoneNumber) {
return {
'phone': phoneNumber,
"roles": ["business", "employee"]
};
} );
}
}
Комментарии:
1. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.