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

Flutter 如何通过设置页SwitchListTile布尔值控制首页振动开关

实现方案

你已经用SharedPreferences做了状态持久化,只需要调整两处代码就能实现需求:

1. 修复空值异常(可选但必要)

设置页读取开关状态时添加默认值,避免首次启动无存储值时报空错误,修改MySettingPage的getSwitchState方法:

Future<bool> getSwitchState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  // 首次读取无值时默认返回false(关闭振动)
  bool isVibrate = prefs.getBool("switchState") ?? false;
  return isVibrate;
}

2. 首页直接读取持久化的开关状态

不需要通过构造函数传递开关状态,每次点击时直接读取本地存储的最新配置,修改MyHomePage的代码:

  • 先移除MyHomePage构造函数中没用的isVibrate参数
  • 修改_incrementCounter方法逻辑:
void _incrementCounter() async {
  // 每次点击都读取最新的开关配置
  SharedPreferences prefs = await SharedPreferences.getInstance();
  bool isVibrateEnabled = prefs.getBool("switchState") ?? false;
  setState(() {
    _counter++;
    if (isVibrateEnabled) {
      Vibration.vibrate(duration: 70);
    } else {
      Vibration.cancel();
    }
  });
}

可选优化:切换设置返回首页后立即生效

如果想要用户改完设置回到首页立刻生效,不需要等下次启动,可以在首页跳转设置页的地方添加返回回调:

onPressed: () async {
  // 等待设置页关闭返回
  await Navigator.push(
      context,
      MaterialPageRoute(
        builder: (BuildContext context) => MySettingPage(),
      ));
  // 返回后可以预读一次开关状态存到本地变量,减少每次点击的IO操作
},

内容的提问来源于stack exchange,提问作者Ary Anzh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:27:03