【发布时间】: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