首页 > 解决方案 > Flutter 无法访问数据,因为它可能为 null

问题描述

如何定义我的函数可以为空?我在 Flutter 上收到以下错误(InsertData 是 repository.dart 中的函数):

`lib/services/categoriesservices.dart:13:30:错误:无法在“存储库”上访问属性“InsertData”?因为它可能为空。

“存储库”来自“package:sqflite2/repositories/repository.dart”(“lib/repositories/repository.dart”)。尝试使用 ? 访问。反而。返回等待_repository.InsertData.call(`

repository.dart如下所示:

import 'package:sqflite/sqflite.dart';
import 'package:sqflite2/repositories/databaseconnection.dart';

class Repository {
  DataBaseConnection? _dataBaseConnection;

  Repository() {
    //initialize database connection
    _dataBaseConnection = DataBaseConnection();
  }

  static Database? _database;
  Future<Database?> get database async {
    if (_database != null) {
      return _database;
    }
    _database = await _dataBaseConnection.setDatabase();
    return database;
  }

  //create function inserting data to database
  InsertData(table, data) async {
    var connection = await database;
    return await connection.insert(table, data);
  }
}

函数初始化如下:

import 'package:sqflite2/models/category.dart';
import 'package:sqflite2/repositories/repository.dart';

class CategoryService {
  Repository? _repository;

  CategoryService() {
    _repository = Repository();
  }

  saveCategory(Categori category) async {
    return await _repository.InsertData("categories", category.categoryMap());
  }
}

我错过了什么?我以为我已经用(?)初始化了存储库

标签: flutterdartsqflite

解决方案


您需要使用? 运算符访问可空对象的成员函数和变量。仅仅声明可为空不会满足编译器的要求。insertData访问函数时可以为空。

它在访问函数之前执行空值检查。

使用运算符尝试以下代码段?

saveCategory(Categori category) async {
    return await _repository?.InsertData("categories", category.categoryMap());
  }

如果您确定该_repository对象在访问该saveCategory(Categori category)函数时不为空。您可以使用!运算符强制确保对象不为空(不推荐)。

return await _repository!.InsertData("categories", category.categoryMap());

您可能还想查看后期修饰符

关于可空函数

返回值

所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。

因此,如果您知道函数的返回类型,请指定它。如果函数可能返回 null,请使用 '?' 返回类型之后。


推荐阅读