You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:36:05