![](/img/trans.png)
[英]Flutter: type 'Future<dynamic>' is not a subtype of type 'Widget'
[英]A dismissed Dismissible widget is still part of the tree in flutter
我有一個 todo 應用程序,它使用provider
進行 state 管理和sqlite
數據庫。
在應用程序中,我嘗試添加Dismissible
小部件以刪除項目。
但問題是當我嘗試刪除項目時它確實從database
中刪除但我在屏幕上出現錯誤。我是 flutter 的新手。
控制台中的錯誤。
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building Dismissible-[<'howll'>](dirty, dependencies: [Directionality], state: _DismissibleState#98163(tickers: tracking 2 tickers)):
A dismissed Dismissible widget is still part of the tree.
Make sure to implement the onDismissed handler and to immediately remove the Dismissible
widget from the application once that handler has fired.
User-created ancestor of the error-causing widget was:
TaskListTile file:///C:/Users/adity/Desktop/flutter-app/todoye/lib/widgets/task_list_view.dart:14:22
When the exception was thrown, this was the stack:
#0 _DismissibleState.build.<anonymous closure> (package:flutter/src/widgets/dismissible.dart:526:11)
#1 _DismissibleState.build (package:flutter/src/widgets/dismissible.dart:533:8)
#2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4047:27)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3941:15)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
...
這是我的代碼。
task_list_tile.dart
Dismissible(
key: Key(taskTitle),
onDismissed: (direction) {
deleteCallback();
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text("$taskTitle removed.")));
},
child: ListTile(
title: Text(
'$taskTitle',
),
task_data.dart
void deleteTask(int id) {
taskDatabaseManager.deleteTask(id);
notifyListeners();
}
數據庫連接.dart
Future<void> deleteTask(int id) async {
await openDb();
await _database.delete(
'tasks',
where: 'id = ?',
whereArgs: [id],
);
}
task_list_view.dart
class TaskListView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<TaskData>(
builder: (context, taskData, child) {
return ListView.builder(
itemCount: taskData.taskCount,
itemBuilder: (context, index) {
return TaskListTile(
taskTitle: taskData.tasks[index].name,
isChecked: taskData.tasks[index].isDone,
checkboxCallback: (checkboxState) {
taskData.updateTask(taskData.tasks[index]);
},
deleteCallback: () {
taskData.deleteTask(taskData.tasks[index].id);
},
);
});
},
);
}
}
如果您確定您的可關閉小部件已被刪除。 嘗試修復key
。 密鑰應該是唯一的。 如果任務的 id 是唯一的,
key: Key(taskData.tasks[index].id)
如果您沒有任何其他恆定且唯一的數據,您可以嘗試
key: UniqueKey()
當您關閉Dismissible
時,您應該將其從小部件樹中刪除。 在您的情況下,您為Dismissible
的每個項目顯示taskData
,因此如果您關閉項目的Dismissible
,則應從列表中刪除該項目。
因此,在deleteCallback
中,在執行deleteTask()
之后,您應該在setState()
中執行taskData.removeAt(index)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.