Flutter中如何重置变量值?SharedPreferences存储用户名不更新求助
问题原因
- 核心问题1:登录请求的参数硬编码了固定用户名
"abc"、密码"abc123",无论前端输入什么账号,提交给后端的都是固定的abc账号,后端返回的自然始终是abc的用户信息。 - 逻辑问题2:SharedPreferences存储、页面跳转逻辑写在了 Dio 请求回调的外部,一旦请求失败走catchError,
getname不会被更新,会把旧的账号名存到本地,就算请求成功,这种写法也存在异步时序风险。 - 可选问题:dashboard页面仅在初始化
initState时拉取一次用户名,如果后续页面不重新创建,不会主动拉取最新的存储值。
修复方案
1. 登录页面代码修复
首先把硬编码的请求参数替换为前端输入框绑定的变量,其次调整异步逻辑顺序,把存储、跳转逻辑移到请求成功的分支内,避免旧值污染。
修复后代码示例:
// 假设你的用户名输入框绑定了TextEditingController userController // 密码输入框绑定了TextEditingController pwdController String getname=""; Future login() async { // 每次登录前先重置变量,避免旧值污染 getname = ""; Dio dio = Dio(); var myPrefs = await SharedPreferences.getInstance(); // 替换硬编码的账号密码为输入框的实际值 Map data = { 'username': userController.text.trim(), 'password': pwdController.text.trim(), 'date': formattedDate }; try { // 用await直接接收响应,替换then写法更易维护 var response = await dio.post(localhostUrlLogin, data: json.encode(data)); getname = response.data['User']['username']; // 请求成功后再存储用户名、跳转页面 await myPrefs.setString('name', getname); // 跳转前清空登录页的输入框(可选) userController.clear(); pwdController.clear(); Navigator.push(context, MaterialPageRoute(builder: (context) => const dashboard())); } catch (e) { // 登录失败做对应提示,不要走存储跳转逻辑 print("登录失败:$e"); } }
2. dashboard页面优化(可选)
如果存在返回登录页再登录、原有dashboard页面不销毁的场景,可以增加页面聚焦时重新拉取用户名的逻辑,确保显示最新值:
class dashboard extends StatefulWidget { @override _dashboardState createState() => _dashboardState(); } class _dashboardState extends State<dashboard> with WidgetsBindingObserver { String getname = ""; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _userDetails(); } // 页面从后台回到前台、或者重新聚焦时触发 @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { _userDetails(); } } _userDetails() async { SharedPreferences myPrefs = await SharedPreferences.getInstance(); setState(() { getname = myPrefs.getString('name') ?? ""; }); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey[200], appBar: MyAppBar(title: const Text("Home")), drawer: const NavigationDrawerWidget(), body: SingleChildScrollView( child: Column(children: [ const SizedBox(height: 10), Center( child: Text( "Hello, $getname", style: const TextStyle(fontSize: 35, fontWeight: FontWeight.bold), ), ), ]), ), ); } }
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

