【问题标题】:Im having trouble populating ListTile in ListView.builder from database我在从数据库中填充 ListView.builder 中的 ListTile 时遇到问题
【发布时间】:2019-11-05 16:50:38
【问题描述】:

我无法从数据库中填充 ListView.builder 中的 ListTile。 我没有“模型类”,因为我不需要更新删除数据我只需要简单的查询。

我有三个类别的 ExpansionTile,在每个类别中我都需要从 db 查询。我不知道要写什么,也不知道要从 db 类返回什么才能使其正常工作。

        child: Column(
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemBuilder: (context, i) => ExpansionTile(
                      title: new Text(
                        '${categoryName[i]}',
                        style: TextStyle(
                            fontSize: 18,
                            fontStyle: FontStyle.normal,
                            fontWeight: FontWeight.bold,
                            color: Color.fromRGBO(49, 85, 158, 1)),
                      ),
                      children: list                //final list = new List.generate(17, (i) => "Item ${i + 1}"); --just to populete with dummy items, instad of this i need db data
                          .map((val) => ListTile(
                                  // leading: Icon(Icons.add),
                                  title: new Row(
                                children: <Widget>[
                                  new Checkbox(
                                      value: _isCheck,
                                      onChanged: (bool value) {
                                        onChange(value);

                                      }),
                                  new Expanded(child: new Text(val)),
                                ],
                              )))
                          .toList(),
                    ),
                itemCount: categoryName.length,
              ),
            ),


          ],
        ),

来自我的数据库类:

  Future<List> getAllNotes() async {
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'books.db');
    Database database = await openDatabase(path, version: 1);
    //var dbClient = await database();
    var result = await database.rawQuery('SELECT * FROM $booksTable WHERE $colDescription = ${'Adventure'}');


    return result.toList();
  }

那么如何编写简单的查询以在 ListView/ListTile 中获取结果?

【问题讨论】:

    标签: android listview flutter


    【解决方案1】:

    您确实需要提供有关您的问题的更多详细信息。无论如何,我试着用我所理解的来回答。

    假设您有一个包含 3 个字段的表名“booksTable”:

    bookId | bookName | bookCategory
      1       Book A     Adventure
      2       Book B      History
      3       Book C     Adventure
      4       Book D      History
    

    确保您在DatabaseHelper() 类中创建所有这些数据库函数,这样您就不必一次又一次地向db 写入逻辑。

    现在您的查询将如下所示:

    Future<List<String>> getAllNotes(String category) async {
        var dbClient = await database();
     List<String> bookNames = List<String();
        var result = await dbClient.rawQuery("SELECT bookname FROM booksTable WHERE bookCategory = $category");
    result.forEach((item) {
     bookNames.add(item["bookname"]);
    });
        return bookNames;
          }
    

    这仅在您必须反序列化 1 列时才有效。如果您选择了多个列,则必须创建一个模型类。

    现在在您的前视图中,您有两个选择: 1)您可以使用 initState 在参数中使用类别的 bookNames 填充您的列表 2)您也可以使用 FutureBuilder 来填充您的列表 (这两个选项都必须使用 StatefulWidget)

    我将在此处向您展示如何使用 initState 进行操作。如果您想知道如何使用 FutureBuilder 进行操作,请在 cmets 中告诉我。

    List<String> booksList =List<String>();
    var db = DatabaseHelper();
    
    readList() async {
    booksList = await db.getAllNotes("Adventure");
    }
    
    @override
    void initState() {
        super.initState();
     readList();
    }
    
    ListView.builder(
                    itemBuilder: (context, i) {
    Column( crossAxisAlignment: CrossAxisAlignment.stretch, 
              children: <Widget>[
                   ExpansionTile(
                          title: new Text(
                            "Adventure Category",
                            style: TextStyle(
                                fontSize: 18,
                                fontStyle: FontStyle.normal,
                                fontWeight: FontWeight.bold,
                                color: Color.fromRGBO(49, 85, 158, 1)),
                          ),
                          ListTile(
                                      title: new Row(
                                    children: <Widget>[
                                      new Checkbox(
                                          value: _isCheck,
                                          onChanged: (bool value) {
                                            onChange(value);
                                          }),
                                      Expanded(child: new Text("${booksList[i]}")),
                                    ],
                                  )))
                        ),])}
                    itemCount: booksList.length,
                  ),
                ),
              ],
            )
    

    注意:上面的代码可能有错别字,因为我是在手机上输入的,但你知道该怎么做吧?

    【讨论】:

    • bookNames.add(item['Category']); 而不是“类别”,你必须写 $colDescriptionbookNames.add(item['$colDescription'])。你必须映射你的列表项,所以你写列名来映射它。休息对我来说似乎很好。
    【解决方案2】:

    所以,我有 ListView(带有 3 个扩展组)我从数组中获取它们:( List categoryName = ['Part 1: Adventure', 'Part 2: History','Part 3: Horror']; 然后在这里传递: 孩子:列( 孩子们: [ 展开( 孩子:ListView.builder( itemBuilder: (context, i) => ExpansionTile( 标题:新文本( '${categoryName[i]}',
    ),

    那部分工作正常,我得到了 3 个可扩展标题,现在需要从 db 填充该部分( ListTile )。 用你的例子:

    readList() 异步 { sinsAgainstGod = 等待 db.getSins("Adventure");

    } 我收到错误:...在“冒险”附近:语法错误.. 并在 booksList 上保持 0 长度...

      Future<List<String>> getNotes(String category) async {
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, 'books.db');
        Database database = await openDatabase(path, version: 1);
    
        List<String> bookNames = List<String>();
        var result = await database.rawQuery("SELECT $colDescription FROM $booksTable WHERE = $category ");
        result.forEach((item) {
          bookNames.add(item['Category']);
    
        });
        return bookNames;
      }
    

    这个 result.forEach(item) 应该做什么?

    【讨论】:

      【解决方案3】:

      感谢您的回答,这很有帮助。 你能告诉我为什么我得到 20 个相同的描述,而不是用这段代码识字:

        Future<List<String>> getSins(String column) async {
          var databasesPath = await getDatabasesPath();
          String path = join(databasesPath, 'confession.db');
          Database database = await openDatabase(path, version: 1);
      
          List<String> bookNames = List<String>();
      
          for (int i = 0; i < 20; i++) {
            var result = await database.rawQuery(
                'SELECT * FROM $plannerTable WHERE $colCategory= "Adventure');
            bookNames.add((result[0][column].toString()));
          }
      
          return bookNames;
      }
      

      我想从冒险类别中获取所有描述。天呐

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 2017-05-01
        • 1970-01-01
        • 2022-01-04
        • 2011-05-22
        • 2015-06-16
        • 2021-03-01
        相关资源
        最近更新 更多