Flutter SQL Switch在应用程序重启时不反映DB值

4ngedf3f  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(105)

我正在使用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])))]))));
  }
}
izkcnapc

izkcnapc1#

Future<void> refreshFlag() async {
  setState(() => isLoading = true);
  final flags = await DBHelper.instance.readAllFlags();
  if (flags.isNotEmpty) {
    final flag = flags.first;
    setState(() {
      isInputVisible = flag.isVisFlag == 1;
      isInputEnabled = flag.isFlag == 1;
      isLoading = false;
    });
  } else {
    setState(() {
      isInputVisible = false; 
      isInputEnabled = false; 
      isLoading = false;
    });
  }
}

相关问题