Flutter 재 구축으로 데이터 변경
저는 Flutter와 Dart의 초보자이며 SQFLite 플러그인을 사용하여 데이터를 유지하는 할 일 목록 앱을 구축하려고합니다. 작업 목록 (사용자 정의 클래스의 개체)이 있고 사용자에게 특정 작업 범주를 선택할 수있는 옵션 (드롭 다운 메뉴를 통해)을 제공하려고합니다. 범주 ID는 작업의 속성으로 저장됩니다. 작업을 기반으로 필터링 된 목록을 생성하고 setState를 사용하여 내 클래스 taskList를이 생성 된 목록으로 설정하면 전체 클래스 목록으로 다시 빌드됩니다. 이 재건이 어디에서 일어나고 있는지 알 수 없습니다.
내 filterTasks 함수는 카테고리 이름을 받아 카테고리 ID를 식별합니다. 사용자가 필터를 지우는 경우 카테고리 이름은 ''입니다. 그런 다음 ID가 일치하는 위치를 찾기 위해 모든 작업을 반복합니다. 데이터베이스도 확인하고 ID가 일치하는 모든 위치를 선택하지만 이것이 작동해야 함을 의미합니다) 일치하는 항목이 있으면 표시되는 작업을이 필터링 된 목록으로 설정합니다.
void filterTasks(String category) async {
await updateList(); //gets the entire list
print('Mid ${this.taskList}'); if (category != '') { int filteredId = await getCategoryId(category); List<Task> filtered = []; int count = taskCount; for (int i = 0; i < count; i++) { if (this.taskList[i].taskCategory == filteredId) { filtered.add(this.taskList[i]); } } if (filtered.isEmpty) { showSnackBar(context, "Error, no tasks of this category exist.", false); setState(() { categoryChoice = null; }); } else { setState(() { this.taskList = filtered; this.taskCount = this.taskList.length; print('End ${this.taskList}');
});
}
}
}
업데이트 목록 기능은 사용자가 필터를 직접 변경하고 필터를 정리할 필요가 없기 때문에 DB에서 전체 작업 및 범주 목록을 검색합니다. 비동기 함수이기 때문에 await로 설정했고이 filterTasks 함수가 완료된 후 필터링 된 목록을 재정의 할 수 있다고 생각했습니다.
이것은 내 빌드 함수의 초기 부분으로, 여기서는 taskList 또는 categoryList가 null 인 경우 업데이트 목록을 호출합니다.
Widget build(BuildContext context) {
print('Start ${this.taskList}');
if (taskList == null || categoryList == null) {
taskList = List<Task>();
categoryList = List<Category>();
updateList();
}
return Scaffold()//my widget tree
함수를 호출하는 드롭 다운 버튼의 코드 :
DropdownButton(
hint: Text(
'Filter',
style: TextStyle(
color: textColor,
),
),
dropdownColor: bgColorPrimary,
value: categoryChoice,//class variable
items: this.categoryList?.map((Category instance) {
return DropdownMenuItem(
value: instance.categoryName,
child: Text(
instance.categoryName,
style: TextStyle(
color: categoryColorsMap[instance.categoryColour],
fontSize: 16.0),
));
})?.toList() ??
[],
onChanged: (newValue) {
filterTasks(newValue);
},
icon: Icon(
Icons.filter_list,
color: textColor,
),
)
필터 목록은 간단히 categoryChoice를 null로 설정하고 (드롭 다운 힌트를 표시하기 위해) ''매개 변수로 filterTasks를 호출하는 드롭 다운 버튼 바로 뒤에있는 다른 아이콘으로 재설정됩니다.
편집 : 일부 인쇄 문, 특히 4 개, 코드 조각에 3 개, updateList 함수 시작 부분에 1 개를 수정 한 후 이제 더 흥미로워졌습니다. updateList의 print 문은 단순히 'triggered'라고 말하고 출력은 다음과 같습니다.
//APP BOOT UP
I/flutter (18734): Start null
I/flutter (18734): triggered
I/flutter (18734): Start [Instance of 'Task', Instance of 'Task', Instance of 'Task', Instance of 'Task']
//THIS IS WHEN I FILTERED THE TASKS
I/flutter (18734): triggered
I/flutter (18734): mid [Instance of 'Task', Instance of 'Task', Instance of 'Task', Instance of 'Task']
I/flutter (18734): End [Instance of 'Task', Instance of 'Task']
I/flutter (18734): Start [Instance of 'Task', Instance of 'Task']
I/flutter (18734): Start [Instance of 'Task', Instance of 'Task', Instance of 'Task', Instance of 'Task']
따라서 taskList가 업데이트되는 동안 전체 목록으로 되 돌리는 것은 updateList가 아닙니다. 나는 단순히 무엇을하는지 알 수 없다. 어떤 도움을 주시면 감사하겠습니다.
추신 : 저는 dart의 초보자이므로 명명 규칙과 더 미세한 OOP 뉘앙스에 완전히 익숙하지 않습니다. 이에 대한 피드백이 있으면 알려주십시오. :) 도움을 주셔서 감사합니다.
답변
나는 마침내 오류를 수정했으며 누군가가 나처럼 초보자 실수를 할 경우를 대비하여 여기에 남겨 둡니다. 문제는 내가 의심했던 것처럼 updateList에 있었지만 나중에 (내 자신의 어리 석음에 많이) 배제했으며 함수가 then 문으로 구성되었으므로 함수를 기다리는 동안 아무것도하지 않았고 filterList가 생성되면 신속하게 대체되었습니다. updateList에 의해 파생 된 전체 목록입니다. updateList 함수를 async로 변경하고 await 키워드를 사용하면 필터 목록이 목록이 업데이트 된 후에 만 생성됩니다.
이전 기능 :
void updateList() {
Future<Database> dbFuture = databaseHelper.initialiseDatabase();
dbFuture.then((database) {
Future<List<Task>> taskListFuture = databaseHelper.getTaskList();
taskListFuture.then((taskList) {
setState(() {
this.taskList = taskList;
this.taskCount = taskList.length;
});
});
Future<List<Category>> categoryListFuture =
databaseHelper.getCategoryList();
categoryListFuture.then((categoryList) {
setState(() {
this.categoryList = categoryList;
this.categoryCount = categoryList.length;
});
});
}
새로운 기능 :
void updateList() async {
Database db = await databaseHelper.initialiseDatabase();
List<Task> taskTemp = await databaseHelper.getTaskList();
List<Category> categoryTemp = await databaseHelper.getCategoryList();
setState(() {
this.taskList = taskTemp;
this.taskCount = taskTemp.length;
this.categoryList = categoryTemp;
this.categoryCount = categoryTemp.length;
});
}
이것은 필터링 오류를 수정했으며 비슷한 상황에 처한 다른 사람에게 도움이되기를 바랍니다. 도와 주신 모든 분들께 감사드립니다.