#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
значения-это вещи, которые гарантированно не являются нулевыми, поскольку они заданы в теле конструктора.