You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqFLite数据无法在ListView中显示的问题排查求助

Fix: ListView Not Displaying Note Data from Database

Hey there, I’ve spotted a couple of key issues in your code that are preventing the ListView from showing your notes—even though they’re successfully being saved to the database. Let’s break them down and fix each one:

1. Uninitialized noteList in getNoteList() Causes Crash

In your DatabaseHelper’s getNoteList() method, you declared List<Note> noteList; but never initialized it to an empty list. When you try to call noteList.add() later, this throws a NullPointerException, which means the FutureBuilder never gets valid data (so snapshot.hasData stays false, and you end up with that empty container instead of your list).

Fixed getNoteList():

Future<List<Note>> getNoteList() async {
  var noteMapList = await getNoteListMap();
  int count = noteMapList.length;
  // Initialize the list to avoid null errors
  List<Note> noteList = [];
  for (int i = 0; i < count; i++) {
    noteList.add(Note.fromMapObject(noteMapList[i]));
  }
  return noteList;
}

2. itemCount Uses an Unsynchronized _count Variable

Your ListView is using _count as the item count, but this variable isn’t being updated to match the actual number of notes returned from the database. Instead, you should directly use snapshot.data.length to ensure it always matches the list of notes you’re trying to display.

Fixed ListView Code:

FutureBuilder<List<Note>>(
  future: _databaseHelper.getNoteList(),
  builder: (BuildContext context, AsyncSnapshot<List<Note>> snapshot){
    // Add error handling to catch unexpected issues
    if(snapshot.hasError){
      return Center(child: Text('Failed to load notes: ${snapshot.error}'));
    }
    if(snapshot.hasData){
      return ListView.builder(
        // Use the length of the returned data directly
        itemCount: snapshot.data.length,
        itemBuilder: (BuildContext context, int position) {
          Note note = snapshot.data[position];
          return Card(
            color: Colors.white,
            elevation: 2.0,
            child: ListTile(
              title: Text(note.title),
              subtitle: Text(note.bodyText),
              onTap: () => _navigateToEditAddPage(note, 'Edit a Note'),
              onLongPress: () => _showDeleteDialog(note),
            ),
          );
        });
    }else{
      // Show a loading indicator instead of an empty container
      return Center(child: CircularProgressIndicator());
    }
  },
),

3. Broken updateData() Where Clause (Potential Future Issue)

While this isn’t causing the ListView problem right now, your updateData() method has a SQL syntax error. You wrote where: 'colId = ?', but colId is your variable name (it holds the string 'id'). You need to use string interpolation to insert the actual column name into the query, otherwise SQL will look for a column named colId (which doesn’t exist).

Fixed updateData():

Future<int> updateData(Note note) async {
  Database db = await this.database;
  var result = await db.update(
    dataTable,
    note.toMap(),
    // Use interpolation to get the correct column name
    where: '$colId = ?',
    whereArgs: [note.id]
  );
  return result;
}

Bonus Tips for Better Debugging & UX

  • Adding the snapshot.hasError check will help you quickly spot any issues with loading data from the database.
  • Replacing the empty container with a CircularProgressIndicator gives users feedback while data loads, and helps you confirm if the Future is running correctly.

After making these changes, rebuild your app—your notes should now show up in the ListView as expected!

内容的提问来源于stack exchange,提问作者Wei Jun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:23:11