【问题标题】:Error: The method '[]' isn't defined for the class 'Future<List<dynamic>> Function()'错误:没有为类“Future<List<dynamic>> Function()”定义方法“[]”
【发布时间】:2020-02-15 00:55:35
【问题描述】:

我是 Flutter 的新手,我真的不知道将 sqlite 数据库与 provider 一起使用。虽然我已经用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]);
                },
              );
            });
      },
    );
  }

任何帮助都会很棒。

【问题讨论】:

  • 这并不完全是一个答案,而是一个建议。我个人讨厌 SQL,所以我通常使用某种 nosql 解决方案,如 sembast 或 hive。 Hive 很容易理解,并带有一些不错的功能。您可能更喜欢使用其中一种来代替您的持久性。

标签: sqlite flutter dart provider


【解决方案1】:

检索数据可能有点棘手,因为它通常是异步运行的。这是我建议的流程。

在初始状态检索数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2021-08-13
    • 2022-01-23
    • 2021-08-27
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多