我正在使用Flutter SQFLite做一个简单的布尔标志保存示例。
我有两个开关标志:
1.显示/隐藏输入字段
1.启用/禁用输入字段
SQFLite不允许创建布尔类型表列。
相反,开发人员可以使用int类型来保存Zero(false)或One(true)。
在我的示例中,值保存在数据库中。
当我从默认值更改标志选择时,数据库显示一,否则数据库显示零。
问题:应用程序重启时,SwitchFlag选择未反映保存的数据库值
预期行为:如果数据库值为零,则UI应显示默认值。
如果数据库值为1,则UI应显示选定或非默认选择。这部分不起作用。
你可以看看我下面的代码,看看我如何解决这个问题。任何意见或建议将不胜感激。谢谢你
示例代码:
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
MyAppState createState() => MyAppState();
}
class Flag1Fields {
static final List<String> values = [id, myFlag];
static final String id = '_id';
static final String myFlag = 'Flag';
}
class myFlag1 {
int? id;
late int? isFlag = 0;
myFlag1({required this.id, required this.isFlag});
myFlag1 copy({int? id, int? isFlag, int? isVisFlag}) =>
myFlag1(id: id ?? this.id, isFlag: isFlag ?? this.isFlag);
Map<String, Object?> toJson() =>
{if (id != null) Flag1Fields.id: id, Flag1Fields.myFlag: isFlag};
static myFlag1 fromJson(Map<String, Object?> json) => myFlag1(
id: json[Flag1Fields.id] as int,
isFlag: int.parse(json[Flag1Fields.myFlag].toString())
);
}
class Flag2Fields {
static final List<String> values = [id, myVisFlag];
static final String id = '_id';
static final String myVisFlag = 'VisFlag';
}
class myFlag2 {
int? id;
late int? isVisFlag = 0;
myFlag2({required this.id,required this.isVisFlag});
myFlag2 copy({int? id, int? isFlag, int? isVisFlag}) =>
myFlag2(id: id ?? this.id, isVisFlag: isVisFlag ?? this.isVisFlag);
Map<String, Object?> toJson() =>
{if (id != null) Flag2Fields.id: id, Flag2Fields.myVisFlag: isVisFlag};
static myFlag2 fromJson(Map<String, Object?> json) => myFlag2(
id: json[Flag2Fields.id] as int,
isVisFlag: int.parse(json[Flag2Fields.myVisFlag].toString())
);
}
class DBHelper {
final String myFlag1Table = 'myFlag1Table';
final String myFlag2Table = 'myFlag2Table';
static const String myDatabase = 'myDB.db';
DBHelper._init();
static final DBHelper instance = DBHelper._init();
static Database? db;
Future<Database> get dataBase async {
if (db != null) {
return db!;
} else {
db = await initDB(myDatabase);
return db!;
}
}
Future<Database> initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return await openDatabase(path, version: 1, onCreate: createDB);
}
Future createDB(Database db, int version) async {
var idType = 'INTEGER PRIMARY KEY AUTOINCREMENT';
var textType = 'TEXT NOT NULL';
await db.execute('''CREATE TABLE $myFlag1Table (${Flag1Fields.id} $idType,${Flag1Fields.myFlag} $textType)''');
await db.execute('''CREATE TABLE $myFlag2Table (${Flag2Fields.id} $idType,${Flag2Fields.myVisFlag} $textType)''');
}
Future<myFlag1> createFlag1(myFlag1 myflag1) async {
final db = await instance.dataBase;
final id = await db.insert(conflictAlgorithm: ConflictAlgorithm.replace,myFlag1Table,myflag1.toJson());
return myflag1.copy(id: id);
}
Future<myFlag2> createFlag2(myFlag2 myflag2) async {
final db = await instance.dataBase;
final id = await db.insert(conflictAlgorithm: ConflictAlgorithm.replace,myFlag2Table,myflag2.toJson());
return myflag2.copy(id: id);
}
Future<List<myFlag1>> readFlag1() async {
final db = await instance.dataBase;
final result = await db.rawQuery('SELECT * FROM $myFlag1Table');
final list = result.map((json) => myFlag1.fromJson(json)).toList();
if (list.isNotEmpty)
return list;
else
throw Exception('Empty List');
}
Future<List<myFlag2>> readFlag2() async {
final db = await instance.dataBase;
final result = await db.rawQuery('SELECT * FROM $myFlag2Table');
final list = result.map((json) => myFlag2.fromJson(json)).toList();
if (list.isNotEmpty)
return list;
else
throw Exception('Empty List');
}
Future<int> updateFlag1(myFlag1 myflag1) async {
final db = await instance.dataBase;
return db.update(myFlag1Table, myflag1.toJson(), where: '${Flag1Fields.id} = ?', whereArgs: [myflag1.id]);
}
Future<int> updateFlag2(myFlag2 myflag2) async {
final db = await instance.dataBase;
return db.update(myFlag2Table, myflag2.toJson(), where: '${Flag2Fields.id} = ?', whereArgs: [myflag2.id]);
}
Future<int> deleteFlag1(int id) async {
final db = await instance.dataBase;
return await db.delete(myFlag1Table, where: '${Flag1Fields.id} = ?', whereArgs: [id]);
}
Future<int> deleteFlag2(int id) async {
final db = await instance.dataBase;
return await db.delete(myFlag2Table, where: '${Flag2Fields.id} = ?', whereArgs: [id]);
}
Future close() async {
final db = await instance.dataBase;
db.close();
}
}
class MyAppState extends State<MyApp> {
TextEditingController mc = TextEditingController();
bool isInputVisible=false;
bool isInputEnabled = false;
bool isLoading = false;
@override
void initState() {
createInputVisibleFlag1();
createInputEnabledFlag2();
readDBInputVisibleFlag1();
readDBInputEnabledFlag2();
super.initState();
}
@override
void dispose() {
mc.dispose();
DBHelper.instance.close();
isLoading = false;
isInputVisible = false;
isInputEnabled = false;
super.dispose();
}
createInputVisibleFlag1() async {
setState(() {
DBHelper.instance.createFlag1(myFlag1(id: 1, isFlag: 0));
});
}
createInputEnabledFlag2() async {
setState(() {
DBHelper.instance.createFlag2(myFlag2(id: 1, isVisFlag: 0));
});
}
readDBInputVisibleFlag1() async {
final flags = await DBHelper.instance.readFlag1();
flags.forEach((element) {
if (element.isFlag == 0) {
isInputVisible = false;
}
if (element.isFlag == 1){
isInputVisible = true;
}
});
return isInputVisible;
}
readDBInputEnabledFlag2() async {
final flags = await DBHelper.instance.readFlag2();
flags.forEach((element) {
if (element.isVisFlag == 0) {
isInputEnabled = false;
}
if (element.isVisFlag == 1){
isInputEnabled = true;
}
});
return isInputEnabled;
}
updateInputVisibleFlag1() async {
if(isInputVisible==false){await DBHelper.instance.updateFlag1(myFlag1(id: 1, isFlag: 0));}
if(isInputVisible==true){await DBHelper.instance.updateFlag1(myFlag1(id: 1, isFlag: 1));}
}
updateInputEnabledFlag2() async {
if(isInputEnabled==false){await DBHelper.instance.updateFlag2(myFlag2(id: 1, isVisFlag: 0));}
if(isInputEnabled==true){await DBHelper.instance.updateFlag2(myFlag2(id: 1, isVisFlag: 1));}
}
@override
Widget build(BuildContext context) {
Widget space = SizedBox(width: 100, height: 20, child: Text(""));
Widget mySwitch1 = SwitchListTile(title: Text("Visible Flag"),value: isInputVisible,
onChanged: (bool value) {
setState(() {
isInputVisible = value;
updateInputVisibleFlag1();
readDBInputVisibleFlag1();
});
});
Widget mySwitch2 = SwitchListTile(title: Text("Enabled Flag"),value: isInputEnabled,
onChanged: (bool value) {
setState(() {
isInputEnabled = value;
updateInputEnabledFlag2();
readDBInputEnabledFlag2();
});
});
Widget myinput = TextField(enabled: isInputEnabled,controller: mc,decoration:InputDecoration(border: OutlineInputBorder(), labelText: '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,space,mySwitch1,space,mySwitch2,space,Visibility(child:myinput,visible:isInputVisible),space])))]))));
}
}
1条答案
按热度按时间izkcnapc1#