RangeError(RangeError(索引):无效值:不在包含范围0..1:2内)ListView

问题描述 投票:0回答:1

我的列表视图出现错误,任务未显示在应用程序中。 我是 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;因为他们说项目计数是问题所在,但事实并非如此。

flutter listview
1个回答
0
投票

很明显,

toDoList[index]
的范围是0..1,因为下面的代码:

toDoList.add([task, isChecked]); /// range 0..1

替换为

toDoList.add([task, isChecked, ""]); /// range 0..2

然后再试一次

© www.soinside.com 2019 - 2024. All rights reserved.