Flutter Flatter Acces令牌在开始时被调用为null,第二次调用后工作正常

Flutter Flatter Acces令牌在开始时被调用为null,第二次调用后工作正常,flutter,dart,sharedpreferences,dio,Flutter,Dart,Sharedpreferences,Dio,我正在尝试将令牌传递到标头。我正在从我的sharepreference访问令牌。数据已成功保存到首选项。但在网络调用中,它在开始时传递空值,但在返回并重新打开页面后工作正常 我的错误: E/flutter (23190): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The getter 'accessToken' was called on null. E/fl

我正在尝试将令牌传递到标头。我正在从我的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, Map<String, dynamic> params) async {
    Response response = await _dio.post(url,
        data: params, options: Options(responseType: ResponseType.json));
    return response;
  }
}
类NetworkUtil{
迪奥迪奥;
字符串标记;
LoginResponse LoginResponse;
NetworkUtil(){
///使用基本选项集receiveTimeout、connectTimeout创建Dio对象
BaseOptions=BaseOptions(接收超时:5000,连接超时:5000);
options.baseUrl=ApiConstants.BASE\u URL;
_dio=dio(选项);
AppPreferences.getLoginPref().then((数据){
this.loginResponse=loginResponse.fromJson(jsonDecode(data));
});
_add(LogInterceptor());
}
///用于调用Get请求
未来获取(字符串url、映射参数)异步{
Response Response=wait_dio.get(url,
查询参数:参数,
选项:选项(responseType:responseType.json,标题:{
“授权”:“承载者${loginResponse.accessToken==null?”:loginResponse.accessToken}”
}));
返回响应;
}
///用于呼叫post请求
Future post(字符串url、映射参数)异步{
Response Response=wait_dio.post(url,
数据:参数,选项:选项(responseType:responseType.json));
返回响应;
}
}
这是我的SharedReference文件:

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);
  }
}
类应用程序首选项{
静态最终字符串LOGIN\u PREF=“LOGIN”;
静态未来getLoginPref()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.get(LOGIN\u PREF)??空;
}
静态setLoginPref(字符串值)异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.setString(LOGIN_PREF,value);
}
}

在构造函数NetworkUtil()中,在使用令牌设置loginResponse之前,必须执行异步操作。当您进行API调用时,它还没有完成。您应该重新设计NetworkUtil initiation并添加一个标志,以了解它是否准备好使用


您可以为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, Map<String, dynamic> params) async {
    Response response = await _dio.post(url, data: params, options: Options(responseType: ResponseType.json));
    return response;
  }
}
类NetworkUtil{
迪奥迪奥;
字符串标记;
LoginResponse LoginResponse;
NetworkUtil(){
///使用基本选项集receiveTimeout、connectTimeout创建Dio对象
BaseOptions=BaseOptions(接收超时:5000,连接超时:5000);
options.baseUrl=apiconstats.BASE\u URL;
_dio=dio(选项);
_add(LogInterceptor());
}
///用于调用Get请求
未来获取(字符串url、映射参数)异步{
loginResponse???=loginResponse.fromJson(jsonDecode(等待AppPreferences.getLoginRef());
Response Response=wait_dio.get(url,
查询参数:参数,
选项:选项(responseType:responseType.json,标题:{
“授权”:“承载者${loginResponse.accessToken==null?”:loginResponse.accessToken}”
}));
返回响应;
}
///用于呼叫post请求
Future post(字符串url、映射参数)异步{
Response-Response=wait_-dio.post(url,数据:params,选项:options(responseType:responseType.json));
返回响应;
}
}