Sqlite 如何使用异步方法构建列表对象?

Sqlite 如何使用异步方法构建列表对象?,sqlite,asynchronous,dart,flutter,Sqlite,Asynchronous,Dart,Flutter,我收到一个错误,该错误表示.length方法正在调用null对象\u genreList 我使用异步方法从本地资产sqlite数据库获取数据,该数据库是一个流派列表。然后我使用ListView.builder在屏幕上显示该列表。这是获取数据的代码 Future getGenreData() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path =

我收到一个错误,该错误表示.length方法正在调用null对象\u genreList

我使用异步方法从本地资产sqlite数据库获取数据,该数据库是一个流派列表。然后我使用ListView.builder在屏幕上显示该列表。这是获取数据的代码

Future getGenreData() async {

    Directory documentsDirectory = await getApplicationDocumentsDirectory();

    String path = join(documentsDirectory.path, "asset_sample_sqlite.db");

    ByteData data = await rootBundle.load(join("assets", "sample_sqlite.db"));

    List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

    await new File(path).writeAsBytes(bytes);

    Database db = await openDatabase(path);

    _genreList = await db.rawQuery('SELECT genre_name[] FROM tbl_genres');

    print(_genreList);

    await db.close();
  }

这里的最终目标是显示一个类型列表(来自我的sqlite数据库中的tbl_类型),它能够将数据传递到下一页以显示一个书籍列表(来自我的sqlite数据库中的tbl_书籍)与该类型相关。

异步编程的全部要点是,当您在后台执行耗时的工作时,您的用户界面可以保持活动状态。因此,在加载应用程序时,您需要(并且希望)显示类似于a甚至空白页(例如a)的内容

至少有两种方法可以做到这一点:

  • 使小部件有状态,并引入一个状态字段
    加载
    ,当您的数据(在另一个字段中)准备就绪时,您将该字段初始化为
    ,并设置为
    。您的代码如下所示:
  • 导入“包装:颤振/材料.省道”;
    类GenresPage扩展StatefulWidget{
    @凌驾
    _GenresPageState createState()=>\u GenresPageState();
    }
    类_GenresPageState扩展状态{
    布尔加载;
    重新命名列表;
    @凌驾
    void initState(){
    super.initState();
    加载=真;
    getGenreData();
    }
    未来getGenreData()异步{
    final genreData=等待实际的GetthoseNames();
    设置状态(){
    genreNames=genreData;
    加载=假;
    });
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    正文:!正在加载?新建ListView.builder(
    itemCount:genreNames.length,
    itemBuilder:(上下文,索引){
    归还新卡(
    孩子:新的ListTile(
    标题:新文本(${genreNames[index]}),
    ),
    );
    },
    ):CircularProgressIndicator(),//或Container()
    );
    }
    }
    
  • 使用一个。因此,您需要重构
    getGenreData
    方法,以将列表作为
    未来的
    返回
    非常感谢你,这帮了大忙。
    @override
      Widget build(BuildContext context) {
    
        return Scaffold(
    
          body: new ListView.builder(
              itemCount: _genreList.length, //need to access the genreList here
              itemBuilder: (BuildContext context, int index) {
                return new Card(
                  child: new ListTile(
                    title: new Text("${_genreList[index]}"),
                    onTap: () {
                      Navigator.push(context,
                      MaterialPageRoute(
                        builder: (context) => BookPage(id: index),
                      ),
                      );
                    }
                  ),
                );
              }
          ),
        );
      }