Flutter开发问题:SharedPreference空值错误及文件夹不可见
一、空值异常(_CastError)问题解决
问题原因分析
- 强制非空运算符滥用:
getData方法中使用!强制将Future<String?>转为非空字符串,当SharedPreference中无对应数据时返回null,直接触发空值异常。 - SharedPreference工具类Bug:
getCred方法参数未被使用,无论传入email还是password,都固定读取'email'键的值,导致密码获取错误。 - 异步逻辑顺序错误:
initState中直接执行登录逻辑,但getData是异步方法,此时email和password仍为初始空字符串,登录逻辑提前执行无意义。 - 异步方法未等待:
checkValuePresent是异步方法,但调用时未加await,无法在getData前完成检查,起不到预期作用。
修复步骤
1. 修复SharedPreference工具类的getCred方法
修改方法,让它根据传入的key读取对应值(同时修正类名、方法返回值等规范问题):
import 'package:shared_preferences/shared_preferences.dart'; class SharedPreference { // 类名首字母大写,符合Dart规范 Future<void> sharedPrefInit() async { await SharedPreferences.getInstance(); } Future<bool> checkValuePresent(String key) async { // 修正返回值类型,添加await确保执行完成 SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.containsKey(key); } Future<void> saveCred({required String email, required String password}) async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('email', email); await prefs.setString('password', password); } Future<String?> getCred(String key) async { // 参数改为key,根据实际传入的键取值 try { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString(key); } catch (e) { return 'Error Fetching Data'; } } Future<void> reset() async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.remove('email'); await prefs.remove('password'); } }
2. 修正启动页的getData与登录逻辑
将登录逻辑抽离为单独方法,确保在异步数据获取完成后执行,同时添加空值安全处理:
String password = ''; String email = ''; @override void initState() { super.initState(); getData(); } void getData() async { // 使用??运算符处理null情况,为空时赋值空字符串 email = await SharedPreference().getCred('email') ?? ''; password = await SharedPreference().getCred('password') ?? ''; setState(() {}); // 数据获取完成后尝试自动登录 attemptAutoLogin(); } void attemptAutoLogin() async { print('Email: $email\nPassword $password'); // 无数据直接跳首页 if (email.isEmpty || password.isEmpty) { navigateToHome(); return; } try { await firebaseAuth.signInWithEmailAndPassword( email: email, password: password ); // 登录成功跳首页 navigateToHome(); } on FirebaseAuthException catch (errMsg) { print('登录失败: $errMsg'); if (errMsg.code == 'user-not-found' || errMsg.code == 'wrong-password') { await SharedPreference().reset(); } // 失败也跳首页 navigateToHome(); } catch (e) { print('其他异常: $e'); navigateToHome(); } } void navigateToHome() { Timer(const Duration(seconds: 3), () { Navigator.pushReplacementNamed(context, 'HomeScreen'); }); }
二、SharedPreference文件夹无法查看问题说明
- Android平台:SharedPreference存储在应用私有目录
/data/data/[你的应用包名]/shared_prefs/,该目录默认被系统隐藏,普通文件管理器无法访问。可通过Android Studio的Device File Explorer或adb shell命令进入查看。 - iOS平台:数据存储在应用沙盒内,同样无法通过普通文件管理器查看,需使用Xcode的Devices and Simulators工具访问。
- 无需手动创建:SharedPreferences会在首次执行读写操作时自动生成对应的文件和目录,无需手动创建。
内容的提问来源于stack exchange,提问作者Mr Fin
相关产品推荐
相关产品推荐

