Flutter 颤振:未处理的异常:对空值使用空检查运算符

Flutter 颤振:未处理的异常:对空值使用空检查运算符,flutter,listview,null,unhandled-exception,sqflite,Flutter,Listview,Null,Unhandled Exception,Sqflite,我正在用颤振应用程序中的SQFLite数据库进行练习。我想创建一个数据库,用户可以在其中添加朋友的姓名和手机号码 添加此信息后,该信息列表将显示在submit按钮下[其中我使用listview.builder()] 一切都很好。数据正在添加到数据库中。(我也手动检查了.db文件)。但是当我刷新列表时,它会显示这样一个错误- flutter: Done Fetch [VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: Null check

我正在用颤振应用程序中的SQFLite数据库进行练习。我想创建一个数据库,用户可以在其中添加朋友的姓名和手机号码

添加此信息后,该信息列表将显示在submit按钮下[其中我使用
listview.builder()
]

一切都很好。数据正在添加到数据库中。(我也手动检查了.db文件)。但是当我刷新列表时,它会显示这样一个错误-

flutter: Done Fetch
[VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
#0      QueryResultSet.columnIndex (package:sqflite_common/src/collection_utils.dart:114:32)
#1      QueryRow.[] (package:sqflite_common/src/collection_utils.dart:135:40)
#2      new Contact.fromMap (package:sample/model/contact.dart:25:15)
#3      DatabaseHelper.fetchContacts.<anonymous closure> (package:sample/utils/database_helper.dart:63:39)
#4      MappedListIterable.elementAt (dart:_internal/iterable.dart:412:31)
#5      ListIterator.moveNext (dart:_internal/iterable.dart:341:26)
#6      new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:188:27)
#7      new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#8      new List.of (dart:core-patch/array_patch.dart:50:28)
#9      ListIterable.toList (dart:_internal/iterable.dart:212:44)
#10     DatabaseHelper.fetchContacts (package:sample/utils/database_helper.dart:63:51)
<asynchronous suspension>
模型类=>

class联系人{
静态常数tblContact=“触点”;
静态常数colId=“id”;
静态常量colName=“name”;
static const colMobile=“mobile”;
接触({
这个身份证,
这个名字,
这个.手机,,
});
int-id;
字符串名;
字符串移动;
映射toMap(){
Map Map={colName:name,colMobile:mobile};
如果(id!=null)映射[colId]=id;
返回图;
}
Contact.fromMap(地图地图){
id=地图[colId];
名称=地图[名称];
mobile=map[colMobile];
}
}
数据库帮助器类=>

导入'dart:io';
.....
类数据库助手{
static const_databaseName=“ContactData.db”;
静态常量_databaseVersion=1;
// 
这意味着如果找不到索引,它可以返回null,因此您应该使模型属性为null

class Contact {
  ...

  int? id;
  String? name;
  String? mobile;

你能确认Contact.fromMap()确实返回了一个正确的联系人模型吗?@ExtremeGeek,我按照说明操作,你能看一下吗?
class Contact {
  static const tblContact = "contacts";
  static const colId = "id";
  static const colName = "name";
  static const colMobile = "mobile";

  Contact({
    this.id,
    this.name,
    this.mobile,
  });

  int id;
  String name;
  String mobile;

  Map<String, dynamic> toMap() {
    Map map = <String, dynamic>{colName: name, colMobile: mobile};
    if (id != null) map[colId] = id;
    return map;
  }

  Contact.fromMap(Map<String, dynamic> map) {
    id = map[colId];
    name = map[name];
    mobile = map[colMobile];
  }
}
import 'dart:io';
.....
class DatabaseHelper {
  static const _databaseName = "ContactData.db";
  static const _databaseVersion = 1;

//<====== Singleton Class
  DatabaseHelper._();
  static final DatabaseHelper instance = DatabaseHelper._();

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

//CREATE DATABASE
  _initDatabase() async {
    Directory dataDirectory = await getApplicationDocumentsDirectory();
    String dbPath = join(dataDirectory.path, _databaseName);
    print(dbPath);
    return await openDatabase(dbPath,
        version: _databaseVersion, onCreate: _onCreate);
  }

  //CREATE TABLE
  _onCreate(Database db, int version) async {
    db.execute(''' 
CREATE TABLE ${Contact.tblContact}(
  ${Contact.colId} INTEGER PRIMARY KEY AUTOINCREMENT,
  ${Contact.colName} STRING NOT NULL,
  ${Contact.colMobile} STRING NOT NULL
);
''');
    print("Done on Create");
  }

  //<===================  ADD DATA

  Future<int> insertContact(Contact contact) async {
    Database db = await database;
    print("Done on Insert");
    return await db.insert(Contact.tblContact, contact.toMap());
  }

  //<==================== Read Data
  Future<List<Contact>> fetchContacts() async {
    Database db = await database;
    List<Map> contacts = await db.query(Contact.tblContact);
    print("Done Fetch");
    return contacts.length == 0
        ? []
        : contacts.map((x) => Contact.fromMap(x)).toList();
  }

}
class Contact {
  ...

  int? id;
  String? name;
  String? mobile;