Flutter SwitchListTile单选修复:适配SQFLite用0/1替代布尔值
解决方案
核心修改点
- 将
DataModel中的布尔类型isSelected改为整数类型(0代表未选中,1代表选中),适配SQFLite存储要求 - 修复单选逻辑:移除全局固定的
index变量,使用ListView.builder的当前item索引处理每个开关状态 - 修正状态更新逻辑,确保每次仅选中一个开关
修正后的完整代码
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
相关产品推荐
相关产品推荐

