There are many questions regarding this error. But I still not find a workable solution for my current situation.
I am trying to build a Task-Todo application using Flutter, Firebase & StreamBuilder. add a task, read a task, and edit task methods worked fine with firebase. But finally got an error, when I implement the delete task method inside a Dismissible widget.
When I'm sliding the ListTile to dismiss the widget, it's showing the error in emulator screen as shown in the below screenshot and disappears.
Error showing and disappearing gif image
This is my StreamBuilder:
import 'package:flutter/material.dart';
import 'package:tick/api/firebase_api.dart';
import 'package:tick/models/task.dart';
import 'package:tick/models/task_data.dart';
import 'package:tick/widgets/task_tile.dart';
import 'package:provider/provider.dart';
class TasksList extends StatelessWidget {
Task? task;
@override
Widget build(BuildContext context) {
return StreamBuilder<List<Task>>(
stream: FirebaseApi.readTask(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return const Text('Something went wrong, try later');
} else if (snapshot.hasData) {
final tasks = snapshot.data;
final provider = Provider.of<TaskData>(context);
provider.setTasks(tasks!);
return Consumer<TaskData>(
builder: (BuildContext context, taskData, child) {
return ListView.builder(
itemCount: taskData.taskCount,
itemBuilder: (context, index) {
final task = taskData.tasks[index];
return Dismissible(
key: Key(task.id!),
onDismissed: (direction) => taskData.deleteTask(task),
direction: DismissDirection.endToStart,
background: Container(
padding: const EdgeInsets.only(right: 5.0),
color: Colors.red,
child: const ListTile(
title: Text(
'Swipe left to delete',
style:
TextStyle(color: Colors.white, fontSize: 18.0),
textAlign: TextAlign.end,
),
trailing: Icon(
Icons.delete_forever_sharp,
color: Colors.white,
size: 30.0,
),
),
),
child: TaskTile(
taskTitle: task.name,
isChecked: task.isDone,
checkboxCallback: (checkboxState) {
taskData.updateTask(task);
},
onLongPressCallback: () => editTask(context, task),
),
);
},
);
},
);
} else {
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
));
}
});
}
and here is my Firebase services:
class FirebaseApi {
static Future<String> createTask(Task task) async {
final docTask = FirebaseFirestore.instance.collection('task').doc();
task.id = docTask.id;
await docTask.set(task.toJson());
return docTask.id;
}
static Stream<List<Task>> readTask() => FirebaseFirestore.instance
.collection('task')
.orderBy(TaskField.createdTime, descending: true)
.snapshots()
.transform(Utils.transformer(Task.fromJson));
static Future editTask(Task task) async {
final docTask = FirebaseFirestore.instance.collection('task').doc(task.id);
await docTask.update(task.toJson());
}
static Future deleteTask(Task task) async {
final docTask = FirebaseFirestore.instance.collection('task').doc(task.id);
await docTask.delete();
}
}
For similar errors, most of the stakeoverflower's recommended using the "key: UniqueKey()". But when I changed my Dismissible widget's key to "UniqueKey()", my edit task, delete task, and Toggle checkmark method are not working and not giving any error messages too.
Appreciate your help