Необработанное исключение: LateInitializationError: поле « <a href="https://stackru-com.translate.goog/cdn-cgi/l/email-protection?_x_tr_sl=en&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=nui" rel="nofollow noopener noreferrer" target="_blank">[email
В моей базе данных я использую статическую позднюю базу данных _db; чтобы завершить _db, но, поскольку мне пришлось использовать поздний инициализатор, я получаю эту ошибку. Также, если я не использую поздний инициализатор, я получаю сообщение об ошибке, когда мне говорят использовать этот инициализатор.
[ОШИБКА: флаттер/lib/ui/ui_dart_state.cc(198)] Необработанное исключение: LateInitializationError: Поле « [email protected] » не было инициализировано.
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart'; // for the use of datbase
import 'dart:async';
import 'package:path_provider/path_provider.dart'; // for the use of path
import 'dart:io'; // for the use of new directory
import 'package:path/path.dart'; // to use the join and make a path for our directory
import '../models/user.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper.internal();
factory DatabaseHelper() =>
_instance;
// here we'll create some final string for our table that we'll create in the db
final String tableUser = "userTable";
final String columnId = "id";
final String columnUserName = "username";
final String columnPassword = "password";
static late Database _db;
Future<Database> get db async {
if (_db != null) {
return _db;
}
_db =
await initDb();
return _db;
}
DatabaseHelper.internal();
initDb() async {
//get a location using the getDatabasesPath
Directory documentDirectory =
await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path,
"main.db");
//open database
var ourDb = await openDatabase(path, version: 1, onCreate: _onCreate);
return ourDb;
}
// here we'll create the db, and table for our database
/*
id | username | password
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 | Rana | rana
2 | Riya | riya
*/
void _onCreate(Database db, int version) async {
await db.execute(
"CREATE TABLE $tableUser($columnId INTEGER PRIMERY KEY, $columnUserName TEXT, $columnPassword TEXT)"); // this is our dataase id that we created
}
// CREATE, READ, UPDATE, DELETE-----From DATABase
//insertion
Future<int> saveUser(User user) async {
var dbClient = await db;
int result =
await dbClient.insert("$tableUser", user.toMap()); // creating our table
return result;
}
/// get the users
Future<List> getAllUsers() async {
var dbClient = await db;
var result = await dbClient.rawQuery("SELECT * FROM $tableUser");
return result.toList(); // -- making the result to a list
}
/// get counted the id
Future<int?> getCount() async {
var dbClient = await db;
return Sqflite.firstIntValue(
await dbClient.rawQuery("SELECT COUNT(*) FROM $tableUser"),
);
}
/// get only one user from database
Future<User?> getUser(int id) async {
var dbClient = await db;
var result = await dbClient
.rawQuery("SELECT * FROM $tableUser WHERE $columnId = $id");
if (result.length == 0) return null;
return User.fromMap(result.first);
}
/// delete from the database
Future<int> deletUser(int id) async {
var dbClient = await db;
return await dbClient
.delete(tableUser, where: "$columnId = ?", whereArgs: [id]);
}
/// update the database
Future<int> updateUser(User user) async {
var dbClient = await db;
return await dbClient.update(tableUser, user.toMap(),
where: "$columnId = ?", whereArgs: [user.id]);
}
/// closeing the database
Future closeDatabase() async {
var dbClient = await db;
return dbClient.close();
}
}
1 ответ
Функция нулевой безопасности Dart не продвигает поля класса при выполнении. см. здесь
if (_db == null)
решение было бы переписать:
static late Database _db;
Future<Database> get db async {
if (_db != null) {
return _db;
}
_db = await initDb();
return _db;
}
к:
static Database? _database;
Future<Database> get db async => _db ??= await _initiateDatabase();
Оператор ??= проверит, является ли _db нулевым, и установит для него значение await _initiateDatabase(), если это так, а затем вернет новое значение _db или вернет, если оно уже имеет значение.
и, наконец, примените тип данных при инициализации БД, чтобы избежать проблем в будущем.
...
Future<Database> initDb() async {
...