Ошибка: метод «[]» не определен для класса «Future»Функция ()» - PullRequest
0 голосов
/ 18 октября 2019

Я новичок во флаттере, и у меня действительно нет идеи использовать базу данных sqlite с provider. хотя я создал приложение todo с provider и успешно добавил к нему sqlite database. Но при получении данных я получаю сообщение об ошибке в моем listViewBuilder виджете.

Ошибка: метод '[]' не определен для класса 'Future> Function ()'.

Это мой код.

database_connection.dart

Future<List<Task>>getTasks() async {
    await openDb();
    final List<Map<String, dynamic>>maps = await _database.query('tasks');
    print(maps);
    return List.generate(maps.length, (i){
      return Task(
        id: maps[i]['id'],
        name: maps[i]['title'],
        date:maps[i]['date'],
        isDone: maps[i]['iscomplete'] == 1 ? true: false,

      );
    });
  }

taskData.dart

class TaskData extends ChangeNotifier {

  final TaskDatabaseManager taskDatabaseManager = new TaskDatabaseManager();


  List<Task> _tasks = [
    Task(name: 'Buy coffee'),
    Task(name: 'Go Shopping'),
    Task(name: 'Go Sleep'),

  ];

//  UnmodifiableListView<Task> get tasks {
//    return UnmodifiableListView(_tasks);
//
//  }

  Future<List>tasks()async {
    return await taskDatabaseManager.getTasks();
  }

task_tile.dart

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]);
                },
              );
            });
      },
    );
  }

любая помощь будет отличной.

1 Ответ

0 голосов
/ 18 октября 2019

Получение данных может быть немного сложнее, так как обычно оно выполняется асинхронно. Вот мой предложенный поток.

Извлечение данных в исходном состоянии.

final List<Task> _tasks;

@override
void initState() {
  super.initState();
  _tasks = taskData.tasks();
}

Возврат заполнителя, когда данные все еще загружаются (обычно индикатор загрузки)

if (_tasks == null) {
  return CircularProgressIndicator(
    valueColor: AlwaysStoppedAnimation(const Colors.white),
  );
}

Когда данные готовы:

return TaskListTile(
  taskTitle: _tasks[index].name,
  isChecked: _tasks[index].isDone,
  checkboxCallback: (checkboxState) {
    taskData.updateTask(_tasks[index]);
  },
  deleteCallback: () {
    taskData.deleteTask(_tasks[index]);
  },
);
...