sqlite - Flutter:类型 'Future<dynamic>' 不是类型 'Widget' 的子类型

标签 sqlite dart flutter

我正在使用 sqlite 将数据存储在我的 Flutter 应用程序中。我有一个模式 bottomsheet,它用 filterchips 打开,当你选择一个时,它会将项目添加到数据库中。如果项目已经存在,则检查 filterchip。当我调用数据库函数来检查该项目是否已经存在时,出现以下错误。

我尝试过同时使用 async 和 await。

数据库查询代码:

// FIND TAG
findTag(int tagId) async {
    var dbConnection = await db;
    var res = await  dbConnection.query("$TABLE_NAME", where: "tagId = ?", whereArgs: [tagId]);
    return res.isNotEmpty ? true : false ;
  }

模态 bottomsheet 小部件容器代码:

Widget build(BuildContext context) {
    setState(() {
      _index = widget.index;
      _list =widget.list;
    });

    return new Container(
      padding: new EdgeInsets.all(27.0),
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.start,
        mainAxisSize: MainAxisSize.min,              
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget> [
          new Text(_list[_index]["title"], style: new TextStyle(  fontWeight: FontWeight.bold, fontSize: 22),),          
          new Text(_list[_index]["description"]),
          getFilterChipsWidgets(),
        ],
      ),
    );

}


getFilterChipsWidgets()
  async {

    List<Widget> tagsList = new List<Widget>();
      for(var i=0; i<_list[_index]["tags"].length; i++) {       
        var dbHelper = DBHelper();
        int id = int.parse(_list[_index]["tags"][i]["id"]);

        var exist = await dbHelper.findTag(id);
        FilterChip item = new FilterChip(
          label: Text(_list[_index]["tags"][i]["name"].toString(),), 
          selected: exist,
          onSelected: (bool newValue) {
            if(newValue) {
              dbHelper.addNewTag(id);
            } else {
              dbHelper.deleteNewTag(id);
            }
          },
        );
        tagsList.add(item);       
      }

       return Wrap(
          spacing: 8.0, // gap between adjacent chips
          runSpacing: 4.0, // gap between lines
          children: tagsList,
        );
}


最佳答案

您的 getFilterChipsWidgets() 是异步函数,因此它将返回 Future。 您可以等待 future 并将小部件保存到列表中,并在完成后调用 setState。 或者像这样用 FutureBuilder 包装它:

    children: <Widget> [
      new Text(_list[_index]["title"], style: new TextStyle(fontWeight: FontWeight.bold, fontSize: 22),),          
      new Text(_list[_index]["description"]),
      FutureBuilder<Widget>(
       future: getFilterChipsWidgets,
       builder: (BuildContext context, AsyncSnapshot<Widget> snapshot){
         if(snapshot.hasData)
           return snapshot.data;

         return Container(child: CircularProgressIndicator());
       }
      ),
    ],

关于sqlite - Flutter:类型 'Future<dynamic>' 不是类型 'Widget' 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55378763/

相关文章:

flutter - 将动态字符串传递给 AppLocalizations.of(context)!在 flutter 中

web - 我在将图像添加到 flutter 项目时遇到问题

c# - 如何在 C# 中找到以编程方式运行应用程序的路径

java - 某些设备上的 Android "no such table"

mysql - 如何限制 SQLite/MySQL 中的列值

flutter - 如何在 Flutter 中完全加载本地镜像资源之前显示加载小部件?

c# - System.Data.Sqlite 1.0.99 guid 比较不起作用

flutter - 应用深色模式会触发StatefulWidget的构建方法几次

dart - 从 Flutter 中的 List<Widget> 中删除 Index wise CustomWidget

javascript - 为什么我的云函数不能正确返回我的 map ?