Поле экземпляра, не допускающее значения null, «_database» должно быть инициализировано

#database #flutter #sqlite #dart

Вопрос:

Я пытаюсь использовать папку ресурсов формы базы данных в своем приложении flutter. Я попробовал этот код :

 class DatabaseHelper {  static const _databaseName = "main.db";  static const _databaseVersion = 1;   DatabaseHelper._privateConstructor();  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();   static Database _database;  Futurelt;Databasegt; 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));  Listlt;intgt; 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  

я новичок в флаттере, я не знаю, что это значит… пожалуйста, помогите мне решить эту проблему 🙂

Комментарии:

1. поместите ключевое слово late в начало для _database

2. @AmitSingh Нет! late как правило, следует использовать в качестве последнего средства. Вы не можете проверить, была ли late переменная инициализирована и _database инициализирована асинхронно. Этот кодекс явно предназначен для _database того, чтобы быть недействительным. Вместо этого измените его объявление на » статическая база данных? _датабаза данных;`.

3. Кто-нибудь действительно ответит на этот вопрос? Не отвечайте в комментариях.

Ответ №1:

Анализатор жалуется, потому что у вас _database , как и сейчас, ненулевое значение, потому что вы используете тип Database , который означает, что значение гарантированно будет там… ненулевое значение. Чтобы сделать что-то обнуляемым, а это так, вам нужно поставить ? за типом, например Database?

 static Database _database;  

должно быть

 static Database? _database;  

Ответ №2:

Вы можете попробовать позднее ключевое слово

 late Database _database;  

Комментарии:

1. Нет, late это должно быть последнее средство. Смотрите мой комментарий к вопросу.

2. Это не late ценность! database Получатель «лениво загружает» _database значение. late значения-это вещи, которые гарантированно не являются нулевыми, поскольку они заданы в теле конструктора.