Необработанное исключение: LateInitializationError: поле « <a href="https://stackru-com.translate.goog/cdn-cgi/l/email-protection?_x_tr_sl=en&amp;_x_tr_tl=ru&amp;_x_tr_hl=ru&amp;_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 {
...
Другие вопросы по тегам