【问题标题】:Unhandled Exception: LateInitializationError: Field '_database@22361766' has not been initialized未处理的异常:LateInitializationError:字段“_database@22361766”尚未初始化
【发布时间】:2023-03-17 23:45:01
【问题描述】:

好的,所以我不知道我做错了什么。我的应用程序无法按预期运行并出现此异常错误 -

E/flutter (14104): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: LateInitializationError: Field '_database@22361766' has not been initialized.
E/flutter (14104): #0      DatabaseProvider._database (package:new_appointment/database/database.dart)
package:new_appointment/database/database.dart:1
E/flutter (14104): #1      DatabaseProvider.database
package:new_appointment/database/database.dart:15
E/flutter (14104): #2      ClientProvider.getClients
package:new_appointment/…/dataproviders/client_provider.dart:17
E/flutter (14104): #3      ClientRepository.getAllClients
package:new_appointment/…/repositories/client_repository.dart:7
E/flutter (14104): #4      ClientBloc.getClients
package:new_appointment/…/blocs/client_bloc.dart:16
E/flutter (14104): #5      new ClientBloc
package:new_appointment/…/blocs/client_bloc.dart:11
E/flutter (14104): #6      new _NewAppointmentState
package:new_appointment/…/screens/new_appointment.dart:22
E/flutter (14104): #7      NewAppointment.createState
package:new_appointment/…/screens/new_appointment.dart:18

看起来一切都是从 DatabaseProvider 开始的。这是它的代码:

final clientTABLE = 'ClientDetails';
class DatabaseProvider {
  static final DatabaseProvider dbProvider = DatabaseProvider();

  late Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await createDatabase();
    return _database;
  }

  createDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "Client.db");

    var database = await openDatabase(path,
        version: 1, onCreate: initDB);
    return database;
  }

  Future initDB(Database database, int version) async {
    await database.execute("CREATE TABLE IF NOT EXISTS $clientTABLE ("
        "firstName VARCHAR, "
        "lastName VARCHAR, "
        "whatsappNo VARCHAR, "
        "email VARCHAR PRIMARY KEY, "
        "location VARCHAR, "
        "projectName VARCHAR, "
        ")");
  }
}

ClientProvider 看起来像这样:

class ClientProvider {
  final dbProvider = DatabaseProvider.dbProvider;

  Future<int> createClient(Client client) async {
    final db = await dbProvider.database;
    var result = db.insert(clientTABLE, client.toDatabaseJson());
    return result;
  }

  Future<List<Client>> getClients({List<String>? columns, String? query}) async {
    final db = await dbProvider.database;
    List<Map<String, dynamic>> result = {} as List<Map<String, dynamic>>;
    if (query != null) {
      if (query.isNotEmpty)
        result = await db.query(clientTABLE,
            columns: columns,
            where: 'firstName LIKE ?',
            whereArgs: ["%$query%"]);
    } else {
      result = await db.query(clientTABLE, columns: columns);
    }

    List<Client> clients = result.isNotEmpty
        ? result.map((item) => Client.fromDatabaseJson(item)).toList()
        : [];
    return clients;
  }
}

我只是想使用 sqflite 包将数据保存到 sqlite 本地数据库中。到目前为止,新添加的数据都不会显示在 UI 上,我也无法添加任何新数据。这个 LateInitializationError 每次都会弹出。

知道我在这里做错了什么吗?非常感谢您的帮助。

【问题讨论】:

  • if (_database != null) 检查没有意义。如果_database 未初始化,则检查将尝试从未初始化的变量中读取。如果您想知道_database 是否已初始化,请将_database 设为可空而不是late
  • 好的。所以我通过编写使 _database 可以为空:数据库? _数据库。另外,我删除了 if (_database != null) return _database 行。现在它出现了一个新错误 - E/flutter (14104): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type '_InternalLinkedHashMap' is not a subtype类型转换中的 'List>' 类型
  • 我上面提到的ClientProvider类里面会弹出这个错误
  • 我的意思是if-check 对于late 变量没有意义;如果变量可以为空,则检查是适当的(并且可能应该在那里)。您的转换错误是一个单独的问题:{} as List&lt;Map&lt;String, dynamic&gt;&gt;; 没有意义,因为 {}Map 并且不能转换为 List...

标签: flutter sqlite dart bloc sqflite


【解决方案1】:

我认为应该是这样的。希望对你有帮助

  Database? _database;

  Future<Database> get database async {
    if (_database == null) 
        _database = await createDatabase();
    return _database;
  }

【讨论】:

    【解决方案2】:

    我也面临同样的问题。我通过改变这个来解决它:

    late Database _database;
          Future<Database> get database async {
            if (_database != null) return _database;
            _database = await createDatabase();
            return _database;
          }
    

    到这里:

     static Database? _database;
      Future<Database> get database async =>
          _database ??= await createDatabase();
    

    【讨论】:

      【解决方案3】:

      以下 Nibha Jain 的回答解决了我的问题。谢谢。

      我也面临同样的问题。我通过改变这个来解决它:

      late Database _database;
              Future<Database> get database async {
                 if (_database != null) return _database;
              _database = await createDatabase();
              return _database;
      }
      

      到这里:

      static Database? _database;
            Future<Database> get database async =>
              _database ??= await createDatabase();
      

      【讨论】:

        猜你喜欢
        • 2023-01-03
        • 2021-11-29
        • 1970-01-01
        • 2022-07-27
        • 2021-10-27
        • 2021-12-29
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多