NetworkError.request(ошибка: ошибка [DioErrorType.other]: тип «Null» не является подтипом типа «Объект» | Flutter

#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. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.