【发布时间】:2022-01-15 18:32:16
【问题描述】:
我使用 DB SQLite,我想更新数据,但是当数据发生变化时,什么也没有发生,只有控制台中弹出一个警告(我附在下面)。我尝试了不同的选项,但我仍然不明白为什么我不能更新数据。虽然创建/删除效果很好,没有问题。更新数据库中的数据造成了这样的困难。如果您能告诉我可能是什么原因,我将不胜感激。
数据库
Future<int> updateTodo(Todo todo) async {
Database db = await database;
return await db
.update(todoTable, todo.toMap(), where: 'id = ?', whereArgs: [todo.id]);
}
edit_todo_screen
class EditTodoScreen extends StatelessWidget {
final Todo todo;
EditTodoScreen({Key? key, required this.todo}) : super(key: key);
final _controller = TextEditingController();
@override
Widget build(BuildContext context) {
_controller.text = todo.description;
return BlocBuilder<TodoBloc, TodoState>(builder: (context, state) {
return Scaffold(
appBar: AppBar(
title: const Text('Edit Todo'),
),
body: _body(context),
);
});
}
Widget _body(context) {
return Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
TextField(
controller: _controller,
autocorrect: true,
decoration: const InputDecoration(hintText: 'Enter todo message'),
),
const SizedBox(
height: 10.0,
),
InkWell(
onTap: () {
BlocProvider.of<TodoBloc>(context).add(
UpdateTodos(
todo,
_controller.text,
),
);
Navigator.pop(context);
},
child: _updateBtn(context),
)
],
),
);
}
todo_bloc
on<UpdateTodos>((event, emit) async {
await todoRepository.updateTodo(event.todo);
final List<Todo> _loadedTodoList = await todoRepository.getAllTodos();
emit(TodoLoadedState(loadedUser: _loadedTodoList));
});
todo_event
class UpdateTodos extends TodoEvent {
final Todo todo;
const UpdateTodos(this.todo);
@override
List<Object> get props => [todo];
}
待办事项列表
class TodoList extends StatefulWidget {
@override
State<TodoList> createState() => _TodoListState();
}
class _TodoListState extends State<TodoList> {
@override
void initState() {
super.initState();
BlocProvider.of<TodoBloc>(context).add(LoadTodos());
}
@override
void dispose() {
BlocProvider.of<TodoBloc>(context).close();
super.dispose();
}
@override
Widget build(BuildContext context) {
final TodoBloc todoBloc = context.read<TodoBloc>();
return BlocBuilder<TodoBloc, TodoState>(builder: (context, state) {
if (state is TodoEmptyState) {
return const Center(
child: Text(
'No Todo',
style: TextStyle(fontSize: 20.0),
),
);
}
if (state is TodoLoadingState) {
return const Center(child: CircularProgressIndicator());
}
if (state is TodoLoadedState) {
return ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: state.loadedUser.length,
itemBuilder: (context, index) => ListTile(
title: Column(children: [
Text('${state.loadedUser[index].description}'),
Text('${state.loadedUser[index].id}'),
]),
trailing: IconButton(
onPressed: () {
todoBloc.add(DeleteTodos(id: state.loadedUser[index].id));
// todoBloc.add(LoadTodos());
},
icon: const Icon(Icons.delete),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EditTodoScreen(
todo: Todo(
description:
'${state.loadedUser[index].description}'),
)),
);
todo_model
class Todo {
int? id;
late String description;
// bool isDone = false;
Todo({this.id, required this.description});
Map<String, dynamic> toMap() {
final map = <String, dynamic>{};
map['id'] = id;
map['description'] = description;
// map['isDone'] = isDone == false ? 0 : 1;
return map;
}
Todo.fromMap(Map<String, dynamic> map) {
id = map['id'];
description = map['description'];
// isDone = map['isDone'] == 0 ? false : true;
}
}
todo_repository
class TodoRepository {
final db = DBProvider();
Future getAllTodos() => db.getTodos();
Future insertTodo(Todo todo) => db.createTodo(todo);
Future updateTodo(Todo todo) => db.updateTodo(todo);
Future deleteTodo(int id) => db.deleteTodo(id);
Future deleteAllTodo(int id) => db.deleteAllTodo(id);
}
当我点击按钮时,这是控制台中的警告
【问题讨论】:
-
能否将代码也包含在
Todo类中? -
好的,打开
-
不,我的意思是
Todo模型,您传递给updateTodo并具有 ID、描述等的模型。 -
明白,补充:)
标签: flutter dart flutter-layout