【问题标题】:How can I return two string values in dart flutter如何在 dart flutter 中返回两个字符串值
【发布时间】:2022-11-17 06:16:06
【问题描述】:

我正在处理我想使用共享首选项的 flutter 项目。看下面的代码:

Future<String?> getCredentials() async {
   final localStorage = await SharedPreferences.getInstance();
   final email = localStorage.getString('email');
   final password = localStorage.getString('password');
   return email, password;
}

这是我的 getCredentials 函数 我希望此函数将电子邮件和密码作为不同的参数返回,但 dart 不允许我可以请你帮助我我该怎么做?

整个 SharedPreference 代码:

import 'package:shared_preferences/shared_preferences.dart';

class sharedPreference {
  Future<String?> saveCredentials({
    required String email,
    required String password,
  }) async {
    final localStorage = await SharedPreferences.getInstance();
    await localStorage.setString('email', email);
    await localStorage.setString('password', password);
  }

  Future<String?> getCredentials() async {
    final localStorage = await SharedPreferences.getInstance();
    final email = localStorage.getString('email');
    final password = localStorage.getString('password');
    return email, password;
  }
}

【问题讨论】:

  • 存储密码是个坏主意。
  • @Patrick 如果我无法存储密码,但用户登录一次后仍然可以在没有凭据的情况下登录,还有其他方法吗?
  • 仅存储密码哈希,例如使用 crypto 包。

标签: flutter dart


【解决方案1】:

只需创建类。您甚至可以稍后将方法添加到 Credentials。就像安全比较一样,将 passwordHash 与常数时间进行比较。

class Credentials {
  Credentials(this.email, this.passwordHash);

  final String email;
  final String passwordHash;
}

Future<Credentials> getCredentials() async {
   final localStorage = await SharedPreferences.getInstance();
   final email = localStorage.getString('email');
   final passwordHash = localStorage.getString('passwordHash');
   return Credentials(email, passwordHash));
}

编辑使用 crypto 获取密码的哈希值:

import 'dart:convert';
import 'package:crypto/crypto.dart';

String getHash(String plainPassword) {
    return sha256.convert(utf8.encode(plainPassword)).toString();
}

【讨论】:

    【解决方案2】:

    将返回类型 String 更改为 Map<String,dynamic>

    Future<Map<String,dynamic>> getCredentials() async {
       final localStorage = await SharedPreferences.getInstance();
       final email = localStorage.getString('email');
       final password = localStorage.getString('password');
       return {
    'email':email,
    'password':password
    
    };
    }
    

    【讨论】:

    • 并且建议不要存储密码......但是如果你想要......你可以将返回类型设置为 Map<String,dynamic>
    • tbh,您应该使用字段电子邮件和密码创建类并将其返回以获得更好的可读性(和智能感知)。
    • @IrfanGanatra 如果我无法存储密码,但用户登录一次后仍然可以在没有凭据的情况下登录,还有其他方法吗?
    • @MrFin 您只需要存储密码的哈希值。使用crypto 将其哈希存储在数据库或其他任何地方。然后用户尝试登录,您可以散列他的输入并将其与存储值进行比较。这将确保即使数据库泄露,您也不会以纯文本形式公开密码。也请看在上帝的份上使用my answer。 Ngl 如果有人在代码中看到这个,他们可能会因为畏缩而死。
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 2022-12-19
    • 2020-01-05
    • 2019-08-18
    • 2017-05-30
    • 2020-09-25
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多