【问题标题】:Unhandled Exception: Null check operator used on a null value...Null Safety in dart未处理的异常:空值检查运算符用于空值......飞镖中的空安全
【发布时间】:2021-11-21 07:30:25
【问题描述】:

我认为这是因为 dart 中的 Null Safety 我面临这个问题。我正在使用 Sqlflite 数据库并在 Flutter 项目中执行简单的 crud 操作。实际上,我在零安全方面面临着非常困难和困惑,我认为这是属于它的问题之一。 下面我给出了我的 3 个文件的代码,它们是 main.dart、database_helper.dart 和 user.dart。 user.dart 的代码是

class User
{
  int? _id;
  String? _name;
  String? _password;
  User(this._name, this._password);

  User.map(dynamic obj)
  {
    this._name = obj['username'];
    this._password=obj['password'];
    this._id=obj['id'];
  }

  String? get username => _name;
  String? get password => _password;
  int? get id => _id;

  Map<String , dynamic> toMap()
  {
    var map = new Map<String , dynamic>();
    map['username'] = _name;
    map['password'] = _password;
    if(_id!=null) 
      {
        map['id'] = _id;
      }
    return map;
  }

  User.fromMap(Map<String, dynamic> map)
  {
    this._name = map['username'];
    this._password=map['password'];
    this._id=map['id'];
  }


} 

database_helper.dart 的代码是

import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sharedprfrnces/models/user.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:async';

class DatabaseHelper
{
  final String tableUser = "userTable";
  final String columnId = "id";
  final String columnUserName = 'userName';
  final String columnPassword = 'password';
  static final DatabaseHelper _instance = new DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

   //static Database? _db;
  static Database? _db;

  Future<Database?> get db async
  {
    if(_db !=null)
      {
        return _db;
      }
    _db = await initDb();
    return _db;
  }
  DatabaseHelper.internal();
  initDb() async
  {
    Directory? DocumentDirectory =await getApplicationDocumentsDirectory();
    String? path = join(DocumentDirectory.path,'maindb.db'); //home://directory//files//maindb.db
    var ourDb =await openDatabase(path , version: 1, onCreate: _onCreate);
    return ourDb;
  }
  void _onCreate(Database database , int version) async
  {
      await _db!.execute(
        "CREATE TABLE $tableUser($columnId INTEGER PRIMARY KEY, $columnUserName TEXT, $columnPassword TEXT)"
      );
  }

  //Insert

  Future<int?> saveUser(User user) async
  {
    var dbClient = await db;

    if (dbClient != null)
      {
      int res = await dbClient.insert(tableUser, user.toMap());
    return res;
  }




  }

  Future<List?> getAllUsers() async
  {
    var dbClient = await db;
    if (dbClient != null)
      {
      var result = await dbClient.rawQuery("SELECT * FROM $tableUser");
    return result.toList();
  }


}
Future<int?> getCount() async
{
  var dbClient = await db;
  if(dbClient!=null) {
    return Sqflite.firstIntValue(
        await dbClient.rawQuery('SELECT COUNT(*) FROM $tableUser'));
  }
  
}
  Future<User?> getUser(int id) async
  {
    var dbClient = await db;
    if(dbClient!=null) {
      var result = await dbClient.rawQuery(
          'SELECT * FROM $tableUser WHERE $columnId=$id');
      if (result.length == 0) return null;
      return new User.fromMap(result.first);
    }

  }

  Future<int?> deleteUser(int id) async
  {
    var dbClient = await db;
    if(dbClient!=null) {
      return await dbClient.delete(
          tableUser, where: "$columnId = ?", whereArgs: [id]);
    }
  }

  Future<int?> updateUser(User user) async
  {
    var dbClient = await db;
    if(dbClient!=null) {
      return await dbClient.update(
          tableUser, user.toMap(), where: '$columnId=?', whereArgs: [user.id]);
    }
    }

  Future close() async
  {
    var dbClient =await db;
    if(dbClient!=null) {
      return dbClient.close();
    }
  }
}

而main.dart的代码是

import 'package:flutter/material.dart';
import 'package:sharedprfrnces/models/user.dart';
import 'package:sharedprfrnces/utils/database_helper.dart';


void main() async
{
  WidgetsFlutterBinding.ensureInitialized();
  var db =new DatabaseHelper();

  //add user
  int? savedUser = await db.saveUser(new User('Saad', 'Ebad'));
  print('user saved $savedUser');

  //Get All users

runApp(
  MaterialApp(
    title: 'Database',
    home: new Home(),
  )
);
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: new Text('Database'),
        centerTitle: true,
        backgroundColor: Colors.lightGreenAccent,

      ),
    );
  }
}

我得到的错误是:

I/flutter ( 3098): error Null check operator used on a null value during open, closing...
E/flutter ( 3098): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
E/flutter ( 3098): #0      DatabaseHelper._onCreate (package:sharedprfrnces/utils/database_helper.dart:40:16)
E/flutter ( 3098): #1      SqfliteDatabaseMixin.doOpen.<anonymous closure> (package:sqflite_common/src/database_mixin.dart:722:40)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #2      SqfliteDatabaseMixin._runTransaction (package:sqflite_common/src/database_mixin.dart:490:16)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #3      SqfliteDatabaseMixin.txnSynchronized (package:sqflite_common/src/database_mixin.dart:321:14)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #4      SqfliteDatabaseMixin.doOpen (package:sqflite_common/src/database_mixin.dart:712:11)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #5      SqfliteDatabaseOpenHelper.openDatabase (package:sqflite_common/src/database.dart:44:7)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #6      SqfliteDatabaseFactoryMixin.openDatabase.<anonymous closure> (package:sqflite_common/src/factory_mixin.dart:112:18)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #7      ReentrantLock.synchronized.<anonymous closure> (package:synchronized/src/reentrant_lock.dart:37:18)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #8      BasicLock.synchronized (package:synchronized/src/basic_lock.dart:33:16)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #9      DatabaseHelper.initDb (package:sharedprfrnces/utils/database_helper.dart:35:16)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #10     DatabaseHelper.db (package:sharedprfrnces/utils/database_helper.dart:27:11)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #11     DatabaseHelper.saveUser (package:sharedprfrnces/utils/database_helper.dart:49:20)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): #12     main (package:sharedprfrnces/main.dart:12:20)
E/flutter ( 3098): <asynchronous suspension>
E/flutter ( 3098): 

【问题讨论】:

    标签: android flutter dart sqflite dart-null-safety


    【解决方案1】:

    这个:

    await _db!.execute
    

    应该是

    await database.execute
    

    作为一般准则,每当您使用! 来说服编译器某些东西不为空时,即使编译器告诉您它可能是......退后一步。编译器是一个非常复杂的工具,而您是初学者。假设编译器是正确的并找到你的错误,而不是仅仅告诉编译器闭嘴。因为以这种方式使用! 就是这样:告诉一个非常有价值的工具闭嘴,因为你认为你更了解它。大多数时候,我们没有。听听你的工具。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 2021-07-22
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多