“Then”无法从异步和等待中获取数据

问题描述 投票:0回答:1

我有一个异步类,可以从 Flutter 安全存储中获取令牌

  readSecureData(String key) async {
    String? data = await storage.read(key: key);
    print('data from secure storage: $data');
    return "asdasd";
  }

我使用 then 方法获取令牌,并通过 dio 工厂类将其存储在变量令牌中,如下所示

class DioFactory {
  //not to have instance
  // ApiService._();
  final FlutterSecureStorage storage = const FlutterSecureStorage();

          static Dio? dio;
    
      Dio getDio() {
        if (dio == null) {
          String? token = "";

     SecureStorage()
          .readSecureData("login_token")
          .then((value) => token = value);

      print("----------------dio");
      print(token);
      print("----------------dio");

      var headers = {
        'Authorization': "Bearer ${token ?? ''}"
      };

      BaseOptions options = BaseOptions(
        baseUrl: ApiConst.apiBaseUrl,
        headers: headers,
      );

      dio = Dio(options);
      return dio!;
    } else {
      return dio!;
    }
  }

但是尽管有一个令牌,但令牌总是返回空,并且我可以看到令牌打印在 readSecureData 函数中,那么我如何从 readSecureData 获取令牌并将其存储在令牌中以将其发送到 dio 标头

flutter dart asynchronous async-await dio
1个回答
0
投票
  void anyFunction() {
    String? anyValue;
    Future.delayed(Durations.long1, () {
      return 'anyString';
    }).then((value) {
      anyValue = value;
    });

    print(anyValue);
  }

看,这是一个包含异步操作但未定义为 Future 的函数。

该函数的输出如下:

flutter: null

因为分配过程是在没有等待Future.delay过程的情况下发生的。


这是一个定义为 Future 的函数,它执行相同的工作。

  Future<void> anyFunction() async {
    String? anyValue;
    await Future.delayed(Durations.long1, () {
      return 'anyString';
    }).then((value) {
      anyValue = value;
    });

    print(anyValue);
  }

这里是这个输出:

flutter: anyString

你明白了吗?

你已经用过这个方法了:

 Future<Dio> getDio() async{
        if (dio == null) {
          String? token = "";

   await  SecureStorage()
          .readSecureData("login_token")
          .then((value) => token = value);

      print("----------------dio");
      print(token);
      print("----------------dio");

      var headers = {
        'Authorization': "Bearer ${token ?? ''}"
      };

      BaseOptions options = BaseOptions(
        baseUrl: ApiConst.apiBaseUrl,
        headers: headers,
      );

      dio = Dio(options);
      return dio!;
    } else {
      return dio!;
    }
© www.soinside.com 2019 - 2024. All rights reserved.