如何使用共享首选项从登录数据中获取令牌

how to take token from login data using shared preferences

下面的 Getchallenge 方法具有从 headers “授权” 接收的令牌的硬编码值我需要它从共享首选项登录数据中获取。我已经将共享首选项添加到 LoginData()。如何在 GetChallange() 方法中获得没有硬编码值的令牌。感谢您对此的帮助。

Future _Getchallenge() async {
 // final prefs = await SharedPreferences.getInstance();
  try {
    final response = await Dio()
        .get(BASE_API + "challenge/getChallengeByUserAndType/calories",
            options: Options(headers: {
              'Authorization':
                  'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOjIsImFkbWluX25hbWUiOiJqYW1lc2JhbiIsImVtYWlsX2FkZHJlc3MiOiJqYW1lc2JhbkBnbWFpbC5jb20iLCJzdGF0dXMiOiJBRE1JTiJ9LCJpYXQiOjE2NTAzNDk0MTc5MTMsImV4cCI6MTY1MDM1MDYyNzUxM30.dDSTVe6ii7KCuF6x8Lgj3Pl2I2dO9Cp71DAMnkw1NPo', //HEAD
             // "Authorization": loginUserData["token"],
            }));

   // prefs.setString('token', response.data["token"].toString());

    Map<String, dynamic> responseJson = await json.decode(response.toString());
    ch = responseJson['data'].reversed.toList();
    print(ch);

    print("length:" + ch.length.toString());
  } catch (e) {
    print(e);
  }
}

 Future LoginData() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      isLoading = true;
      typing = false;
    });
    try {
      var response = await Dio().post(BASE_API + 'user/login', data: {
        "username": username,
        "password": password,
        "wallet_address": wallet_address,
      });
     // print(response.data["sub"]["id"]);
    //  print(response);

      if (response.data["status"] == "LoginSuccess") {
        setState(() {
          prefs.setString('token', response.data["token"].toString());
          isLoading = false;
          loginUserData["id"] = response.data["sub"]["id"].toString();
          loginUserData["username"] = response.data["username"].toString();
          loginUserData["wallet_address"] = response.data["wallet_address"].toString();
        });
        final myString = prefs.getString('token') ?? '';
        print(myString);
        Get.snackbar(
          "success",
          "logged in successfully",
          backgroundColor: buttontext.withOpacity(0.5),
          colorText: textWhite,
          borderWidth: 1,
          borderColor: Colors.grey,
        );

        Get.to(BottomNavigation());
      } else {
        setState(() {
          isLoading = false;
          typing = true;
        });
        Get.snackbar(
          "error",
          "No User Found",
          backgroundColor: buttontext.withOpacity(0.5),
          colorText: textWhite,
          borderWidth: 1,
          borderColor: Colors.grey,
        );
      }
      print("res: $response");
      setState(() {
        isLoading = false;
        typing = true;
      });
    } catch (e) {
      setState(() {
        isLoading = false;
        typing = true;
      });
      Get.snackbar("Error", "Something went wrong.Please contact admin",
          backgroundColor: buttontext.withOpacity(0.5),
          borderWidth: 1,
          borderColor: Colors.grey,
          colorText: Colors.white,
          icon: const Icon(
            Icons.error_outline_outlined,
            color: Colors.red,
            size: 30,
          ));
      print(e);
    }
  }

只需声明一个名为 token 的变量,然后等待共享首选项获取 实例 一旦获取,只需使用 key 您在共享首选项中保存令牌时设置并将该值传递给您的 API

  Future _Getchallenge() async {
          String? token;
          final prefs = await SharedPreferences.getInstance();
    token = prefs.getString('token');
          try {
            final response = await Dio()
                .get(BASE_API + "challenge/getChallengeByUserAndType/calories",
                    options: Options(headers: {
                      'Authorization':
                          'Bearer $token', //HEAD
                     // "Authorization": loginUserData["token"],
                    }));
        
           // prefs.setString('token', response.data["token"].toString());
        
            Map<String, dynamic> responseJson = await json.decode(response.toString());
            ch = responseJson['data'].reversed.toList();
            print(ch);
        
            print("length:" + ch.length.toString());
          } catch (e) {
            print(e);
          }
        }

您可以简单地通过 getString 方法从 SharedPreferences 获取令牌,就像您通过 setString 方法将其保存在登录中一样。

Future _Getchallenge() async {
final prefs = await SharedPreferences.getInstance();
  try {
    final response = await Dio()
        .get(BASE_API + "challenge/getChallengeByUserAndType/calories",
            options: Options(headers: {
              'Authorization':
                  'Bearer ${prefs.getString('token')}'
            }));
    
    Map<String, dynamic> responseJson = await json.decode(response.toString());
    ch = responseJson['data'].reversed.toList();
    print(ch);

    print("length:" + ch.length.toString());
  } catch (e) {
    print(e);
  }
}