SQLite删除方法在Flutter中也不起作用

n6lpvg4x  于 2023-06-23  发布在  SQLite
关注(0)|答案(1)|浏览(122)

我正在使用sqlite deleteSqlite制作一个todo应用程序,在删除过程中按下按钮时它不会删除,但我想知道为什么它会在热重绘时删除?

Future<void> _deleteTodoItem(int id, String text, bool isDone) async {
    await TodoModelDao().deleteTodo(id, text, isDone);
    refleshList();
  }
  Future<List<TodoModel>> _showAllData() async {
    var todoList = await TodoModelDao().getAllData();
    return todoList;
  }

  refleshList() {
    setState(() {
      _showAllData();
    });
  }
Future<void> deleteTodo(int id, String text, bool isDone) async {
    var db = await DatabaseHelper.dbAccess();

    await db.delete(TABLENAME, where: "$ID = ?", whereArgs: [id]);
  }
  Future<List<TodoModel>> getAllData() async {
    var db = await DatabaseHelper.dbAccess();

    List<Map<String, dynamic>> maps = await db.rawQuery("SELECT * FROM $TABLENAME");

    return List.generate(maps.length, (i) {
      var row = maps[i];
      return TodoModel(id: row[ID], text: row[TEXT]);

    });
  }
child: IconButton(
            onPressed: () {
              _deleteTodoItem(widget.todoModel.id, widget.todoModel.text,
                  widget.todoModel.isDone);
            },
            icon: const Icon(Icons.delete),
            color: Coloors.whiteColor,
            iconSize: 18,
          ),
rfbsl7qr

rfbsl7qr1#

它确实删除了,但是flutter不知道你想在删除后重新渲染ui。
当你热重启时,它会重新渲染它。有很多工作围绕这一点。
一个简单的解决方案是调用setState强制重新渲染。
你可以尝试用下面的代码替换你的代码(IconButton)的某些部分。

child: IconButton(
            onPressed: () async {
             await _deleteTodoItem(widget.todoModel.id, widget.todoModel.text,
                  widget.todoModel.isDone);
              // force re-render ui
              setState(() {
                // update your variable here...
                 _showAllData();
             });
            },
            icon: const Icon(Icons.delete),
            color: Coloors.whiteColor,
            iconSize: 18,
          ),

相关问题