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

Flutter SwitchListTile单选修复:适配SQFLite用0/1替代布尔值

解决方案

核心修改点

  1. 将 DataModel 中的布尔类型 isSelected 改为整数类型(0代表未选中,1代表选中),适配SQFLite存储要求
  2. 修复单选逻辑:移除全局固定的 index 变量,使用ListView.builder的当前item索引处理每个开关状态
  3. 修正状态更新逻辑,确保每次仅选中一个开关

修正后的完整代码

import 'package:flutter/material.dart';

void main() {runApp(MyApp());}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

// 修改DataModel:isSelected改为整数类型,默认0(未选中)
class DataModel{
  int id;
  String name;
  int isSelected;
  DataModel({required this.id, required this.name, this.isSelected = 0});
}

class _MyAppState extends State<MyApp> {
  final List<DataModel> names = <DataModel>[];
  TextEditingController mc = TextEditingController();

  addItemToList() {
    setState(() {
      if (mc.text.isNotEmpty) {
        // 添加新项时默认设置为未选中(0)
        names.add(DataModel(id:names.length+1, name:mc.text, isSelected: 0));
      }
    });
  }

  // 新增带参数的方法,根据传入的索引判断该项是否选中
  bool isItemSelected(int index){
    return names[index].isSelected == 1;
  }

  @override
  Widget build(BuildContext context) {
    Widget space = SizedBox(width: 100, height: 5, child: Text(""));
    Widget myinput = TextField(controller: mc,decoration:InputDecoration(border: OutlineInputBorder(), labelText: 'Name'));
    Widget btnAdd = ElevatedButton(onPressed: addItemToList, child: Text('Add'));
    Widget mylist = SizedBox(width: 800,height: 500,child: ListView.builder(
        shrinkWrap: true,
        itemCount: names.length,
        itemBuilder: (BuildContext context, int index) {
          return SingleChildScrollView(
            child: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                SwitchListTile(
                    title: Text(names[index].name, style: TextStyle(fontSize: 11)),
                    // 使用当前item的索引判断选中状态
                    value: isItemSelected(index),
                    onChanged: (bool value) {
                      setState(() {
                        // 先将所有项设为未选中(0)
                        names.forEach((item)=>item.isSelected = 0);
                        // 将当前项设为选中(1)
                        names[index].isSelected = 1;
                        // 更新输入框内容
                        mc.text=names[index].name;
                      });
                    })
              ],
            ),
          );
        },
      ),
    );

    return MaterialApp(home: Scaffold(resizeToAvoidBottomInset: false,body: SingleChildScrollView(scrollDirection: Axis.vertical,child: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,mainAxisSize: MainAxisSize.min,children: <Widget>[
              Container(padding: const EdgeInsets.all(5),child: SingleChildScrollView(child: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[space,myinput,space,btnAdd,space,mylist,space])))]))));
  }
}

关键逻辑说明

  • 数据模型适配:把isSelected从布尔值改为整数,0对应未选中,1对应选中,完全符合SQFLite的存储规则
  • 单选逻辑修复:每次触发开关切换时,先遍历所有项设置为未选中,再将当前点击的项设为选中,确保同一时间仅一个开关处于激活状态
  • 索引问题解决:移除了全局固定的index变量,改用ListView.builder提供的当前item索引,每个开关独立判断自身的选中状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:23:14