【问题标题】:Non-nullable instance field '_database' must be initialized必须初始化不可为空的实例字段“_database”
【发布时间】:2021-10-15 03:16:10
【问题描述】:

我正在尝试在我的颤振应用程序中使用数据库表单资产文件夹。我试过这段代码:

class DatabaseHelper {
  static const _databaseName = "main.db";
  static const _databaseVersion = 1;

  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  static Database _database;
  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _initDatabase(); // only initialize if not created already
    return _database;
  }

  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);

    if (!(await databaseExists(path))) {
      ByteData data = await rootBundle.load(join("assets", _databaseName));
      List<int> bytes =
          data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
      await File(path).writeAsBytes(bytes);
    }
    return await openDatabase(path, version: _databaseVersion);
  }
}

但代码在此代码DatabaseHelper._privateConstructor(); 处抛出此错误 错误: 必须初始化不可为空的变量“_database”。 尝试添加一个初始化表达式。

在这段代码中: 静态数据库_database;

Non-nullable instance field '_database' must be initialized.
Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.dartnot_initialized_non_nullable_instance_field

我是 Flutter 的新手,我不知道那是什么意思...请帮我解决这个问题 :)

【问题讨论】:

  • 将late关键字放在_database的开头
  • @AmitSingh 不! late 通常应作为最后的手段使用。您无法检查 late 变量是否已初始化,而 _database 是否已异步初始化。这段代码显然打算让_database 可以为空。而是将其声明更改为`静态数据库? _database;`.
  • 真的有人会回答这个问题吗?不要在 cmets 中回答。

标签: database flutter sqlite dart


【解决方案1】:

分析器抱怨是因为你有_database,因为它现在是非空的,因为你使用的是Database 类型,这意味着保证有一个值......非空。要使某些东西可以为空,您需要在类型后面加上 ?,例如Database?

static Database _database;

应该是

static Database? _database;

【讨论】:

    【解决方案2】:

    你可以试试late关键字

    late Database _database;
    

    【讨论】:

    • 不,late 应该是最后的手段。请参阅我对问题的评论。
    • 这不是late 值! database getter 是“延迟加载”_database 值。 late 值是保证不为空的东西,因为它们是在构造函数的主体中设置的。
    猜你喜欢
    • 2021-07-06
    • 2021-07-06
    • 1970-01-01
    • 2021-09-14
    • 2021-09-24
    • 2021-10-11
    • 2021-08-27
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多