sqlite - 使用 sqflite 中的数据填充 FutureBuilder 时出错

标签 sqlite flutter dart sqflite

我有一个包含电影的 SQLite 数据库。我正在关注this示例。

我想在 ListView 中显示所有电影.

我尝试填充 ListView使用FutureBuilder就像示例中一样,但是我分配了 FutureBuilder 的 future ,它会抛出以下异常:

type 'Future<dynamic>' is not a subtype of type 'Future<List<Movie>>'

我觉得这很奇怪,因为我在 FutureBuilder 中使用的函数返回 List<Movie>而不是dynamic .

什么可能导致此错误?

数据库:

class MovieDatabase {
  MovieDatabase._();
  static final MovieDatabase db = MovieDatabase._();
  static Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await initDB();
    return _database;
  }

  initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "MovieDB.db");
    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute("CREATE TABLE Movie ("
          ...
          ")");
    });
  }

  getAllMovies() async {
    final db = await database;
    var res = await db.query("Movie");
    List<Movie> list =
        res.isNotEmpty ? res.map((m) => Movie.fromSqLite(m)).toList() : [];
    return list;
  }
  ...
}

小部件:

@override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        children: <Widget>[
          FutureBuilder<List<Movie>>(
            future: MovieDatabase.db.getAllMovies(), // This line causes the error
            initialData: List(),
            builder:
                (BuildContext context, AsyncSnapshot<List<Movie>> snapshot) {
              return snapshot.hasData
                  ? ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (BuildContext context, int position) {
                        Movie movie = snapshot.data[position];
                        return Card(
                          child: ListTile(
                            title: Text(movie.title),
                          ),
                        );
                      },
                    )
                  : Center(
                      child: CircularProgressIndicator(),
                    );
            },
          ),
        ],
      ),
    );
  }

最佳答案

方法getAllMovies()没有特定的返回类型,因此默认情况下它将返回:

  1. void:如果没有返回语句。
  2. 动态:是否有返回语句。如果返回 int,则为 Int;如果返回 String,则为 String...

在你的例子中,它返回一个列表,但 dart 在调用该方法之前并不知道这一点。小部件 FutureBuilder 需要一个需要显式返回电影列表的函数,而不是动态的。

只需添加一个电影列表作为getAllMovies()方法的返回类型,就可以开始了:

 List<Movies> getAllMovies() async {
    final db = await database;
    var res = await db.query("Movie");
    List<Movie> list =
        res.isNotEmpty ? res.map((m) => Movie.fromSqLite(m)).toList() : [];
    return list;
  }

关于sqlite - 使用 sqflite 中的数据填充 FutureBuilder 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58651795/

相关文章:

java - 在sqlite的中间表中插入值

flutter - 将多图像选择器与图像裁剪器一起使用

dart - 在容器中包装文本

dart - 使用 fluro 导航时更改值

android - 将 CheckBox 值插入 SQLite Android

python - Python 中的 sqlite3 提取与元组中的值相对应的条目

sqlite:只读数据库中的临时表/ View ?

flutter - 如何在 flutter 中设置特定容器中所有文本的颜色?

flutter - Dart/Flutter 主题类(class)代码的字符串转换

flutter - 如何在 Flutter 的 Repaintboundary 中添加视频播放器