我的列表视图出现错误,任务未显示在应用程序中。 我是 flutter 新手,我不知道该怎么办了
class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
TaskList taskList = Provider.of<TaskList>(context, listen: false);
taskList.loadTask();
print('ToDo List: ${taskList.toDoList}');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Examination'),
centerTitle: true,
),
drawer: const DrawerFb1(),
body: SizedBox(
width: double.infinity,
child: Consumer<TaskList>(
builder: (context, todoListModel, child) {
final data = todoListModel.toDoList;
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) {
String title = data[index][0];
bool isChecked = data[index][1];
String paragraph = data[index][2];
return GestureDetector(
onTap: () {
todoListModel.openTaskDetails(
context,
title,
paragraph,
);
},
child: TodoTile(
onChanged: (value) =>
todoListModel.checkBoxChanged(value, index),
taskCompleted: isChecked,
deleteFunction: (context) =>
todoListModel.deleteTask(index),
taskName: title,
),
);
},
);
},
),
),
}
}`
import 'package:exam_1/widgets/dialog_box.dart';
import 'package:exam_1/widgets/task_details.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class TaskList extends ChangeNotifier {
final _title = TextEditingController();
final _paragraph = TextEditingController();
bool isChecked = false;
final String key = 'isChecked';
List<List<dynamic>> toDoList = [];
TaskList() {
loadTask();
}
Future<void> loadTask() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String>? savedTasks = prefs.getStringList('tasks');
if (savedTasks != null) {
for (var task in savedTasks) {
bool isChecked = await loadCheckBoxState(task);
toDoList.add([task, isChecked]);
}
}
notifyListeners();
}
Future<bool> loadCheckBoxState(String task) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool('$key:$task') ?? false;
}
void saveTasks() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> tasks = toDoList.map((task) => task[0] as String).toList();
prefs.setStringList('tasks', tasks);
print('Tasks saved: $tasks');
}
void checkBoxChanged(bool? value, int index) async {
if (value != null) {
String task = toDoList[index][0] as String;
toDoList[index][1] = value;
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('$key:$task', value);
saveTasks();
notifyListeners();
}
}
void createNewTask(BuildContext context) {
showDialog(
context: context,
builder: (context) {
return DialogBox(
titleController: _title,
paragraphController: _paragraph,
onSave: () => saveNewTask(context, _title.text, _paragraph.text),
onCancel: () {
Navigator.of(context).pop();
},
);
},
);
notifyListeners();
}
void saveNewTask(BuildContext context, String title, String paragraph) {
if (title.isEmpty || paragraph.isEmpty) {
showDialog(
context: context,
builder: (context) {
return const AlertDialog(
title: Text('Please Add a note'),
);
},
);
} else {
toDoList.add([title, false, paragraph]);
_title.clear();
_paragraph.clear();
saveTasks();
Navigator.of(context).pop();
`notifyListeners();
}
}
void deleteTask(int index) {
toDoList.removeAt(index);
saveTasks();
notifyListeners();
}
void openTaskDetails(BuildContext context, String title, String paragraph) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
TaskDetailsPage(title: title, paragraph: paragraph),
),
);
}
}
我尝试创建一个最终数据类型并像这样创建它:final data = todoListModel.toDoList;因为他们说项目计数是问题所在,但事实并非如此。
很明显,
toDoList[index]
的范围是0..1,因为下面的代码:
toDoList.add([task, isChecked]); /// range 0..1
替换为
toDoList.add([task, isChecked, ""]); /// range 0..2
然后再试一次