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

Flutter SQFLite开关重启后无法显示数据库存储值问题求助

修复SQFLite存储布尔标记后重启UI状态不同步的问题

核心问题定位

重启后开关状态不匹配数据库值,基本都是初始化阶段未正确从数据库读取存储值并同步到UI状态,或是状态更新未触发组件重建导致的。以下是针对性修复方案:


1. 初始化时从数据库加载数据

在Widget的initState中先完成数据库初始化,再查询存储的int值并转换为bool更新状态:

class _SettingPageState extends State<SettingPage> {
  bool _showInput = false;
  bool _enableInput = false;
  late Database _db;

  @override
  void initState() {
    super.initState();
    // 先初始化数据库,再加载存储的设置
    _initDB().then((_) => _loadSavedSettings());
  }

  Future<void> _initDB() async {
    _db = await openDatabase(
      'app_settings.db',
      version: 1,
      onCreate: (db, version) async {
        await db.execute('''
          CREATE TABLE settings (
            id INTEGER PRIMARY KEY,
            show_input INTEGER,
            enable_input INTEGER
          )
        ''');
        // 插入默认初始值
        await db.insert('settings', {
          'id': 1,
          'show_input': 0,
          'enable_input': 0,
        });
      },
    );
  }

  Future<void> _loadSavedSettings() async {
    final result = await _db.query('settings', where: 'id = ?', whereArgs: [1]);
    if (result.isNotEmpty) {
      setState(() {
        // 把int转成bool:1对应true,0对应false
        _showInput = result[0]['show_input'] == 1;
        _enableInput = result[0]['enable_input'] == 1;
      });
    }
  }

  // ... 其他逻辑
}

2. 确保保存到数据库的逻辑正确

切换开关时,将bool转为int(true→1,false→0)写入数据库,同时更新状态:

void _toggleShowInput(bool value) {
  setState(() {
    _showInput = value;
  });
  // 更新数据库
  _db.update(
    'settings',
    {'show_input': value ? 1 : 0},
    where: 'id = ?',
    whereArgs: [1],
  );
}

void _toggleEnableInput(bool value) {
  setState(() {
    _enableInput = value;
  });
  _db.update(
    'settings',
    {'enable_input': value ? 1 : 0},
    where: 'id = ?',
    whereArgs: [1],
  );
}

3. 检查UI层的开关绑定

确保Switch组件的value直接绑定状态变量,onChanged调用对应的切换方法:

Column(
  children: [
    SwitchListTile(
      value: _showInput,
      onChanged: _toggleShowInput,
      title: const Text('显示/隐藏输入框'),
    ),
    SwitchListTile(
      value: _enableInput,
      onChanged: _toggleEnableInput,
      title: const Text('启用/禁用输入框'),
    ),
    if (_showInput)
      TextField(
        enabled: _enableInput,
        decoration: const InputDecoration(hintText: '测试输入框'),
      ),
  ],
)

常见错误排查

  • 数据库初始化未插入默认记录:首次启动时如果没有默认的settings数据,查询会返回空列表,状态始终用初始值。
  • 忘记调用setState:加载数据后必须调用setState触发UI重建,否则状态更新不会显示到界面。
  • 类型转换错误:直接将int值赋值给bool变量(必须用==1判断完成转换)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:29:53