Flutter Acces令牌在开始时被称为null,第二秒后可以正常工作

问题描述

我正在尝试将令牌传递给标头。我正在从我的sharepreference访问令牌。数据已成功保存到首选项。但是在网络调用中,它在开始时传递了一个空值,但在返回并重新打开页面后仍然可以正常工作。

我的错误:

E/flutter (23190): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The getter 'accessToken' was called on null.


  E/flutter (23190): Receiver: null
    E/flutter (23190): Tried calling: accessToken
    E/flutter (23190): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
    E/flutter (23190): #1      NetworkUtil.get (package:example/apihandler/network/NetworkUtil.dart:55:52)

我的网络班级

class NetworkUtil {
  Dio _dio;
String token;
  LoginResponse loginResponse;




  NetworkUtil() {
    ///Create Dio Object using baseOptions set receiveTimeout,connectTimeout
    BaseOptions options = BaseOptions(receiveTimeout: 5000,connectTimeout: 5000);
    options.baseUrl = ApiConstants.BASE_URL;
    _dio = Dio(options);

      AppPrefernces.getLoginPref().then((data) {
        this.loginResponse = LoginResponse.fromJson(jsonDecode(data));
      });

      
    _dio.interceptors.add(LogInterceptor());

  }





  ///used for calling Get Request
  Future<Response> get(String url,Map<String,String> params) async {
    Response response = await _dio.get(url,queryParameters: params,options: Options(responseType: ResponseType.json,headers: {
          "Authorization": "Bearer ${loginResponse.accessToken==null?"":loginResponse.accessToken}"
        }));
    return response;
  }

  ///used for calling post Request
  Future<Response> post(String url,dynamic> params) async {
    Response response = await _dio.post(url,data: params,options: Options(responseType: ResponseType.json));
    return response;
  }
}

这是我的Sharedpreference文件:

class AppPrefernces {
  static final String LOGIN_PREF = "login";

  static Future<String> getLoginPref() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.get(LOGIN_PREF) ?? null;
  }



  static setLoginPref(String value) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString(LOGIN_PREF,value);
  }
}

解决方法

在构造函数NetworkUtil()中,在使用令牌设置loginResponse之前,您需要进行异步操作。进行API调用时,操作尚未完成。您应该重新设计NetworkUtil初始化,并添加一个标志以了解它是否可以使用。

您可以使用git_it并为NetworkUtil创建异步惰性单例。

,

当您调用get方法时,loginResponse值尚未分配。

class NetworkUtil {
  Dio _dio;
  String token;
  LoginResponse loginResponse;

  NetworkUtil() {
    ///Create Dio Object using baseOptions set receiveTimeout,connectTimeout
    BaseOptions options = BaseOptions(receiveTimeout: 5000,connectTimeout: 5000);
    options.baseUrl = ApiConstants.BASE_URL;
    _dio = Dio(options);

    _dio.interceptors.add(LogInterceptor());
  }

  ///used for calling Get Request
  Future<Response> get(String url,Map<String,String> params) async {
    loginResponse ??= LoginResponse.fromJson(jsonDecode(await AppPrefernces.getLoginPref()));

    Response response = await _dio.get(url,queryParameters: params,options: Options(responseType: ResponseType.json,headers: {
          "Authorization": "Bearer ${loginResponse.accessToken == null ? "" : loginResponse.accessToken}"
        }));
    return response;
  }

  ///used for calling post Request
  Future<Response> post(String url,dynamic> params) async {
    Response response = await _dio.post(url,data: params,options: Options(responseType: ResponseType.json));
    return response;
  }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...