Flutter I/颤振(29011):无此方法错误:方法';插入';在null上调用了。单翼颤振

Flutter I/颤振(29011):无此方法错误:方法';插入';在null上调用了。单翼颤振,flutter,dart,sqflite,Flutter,Dart,Sqflite,当我从api获取数据时,我从ui调用数据库帮助器类,这些数据必须转储到数据库中才能在应用程序中脱机使用。我得到了这个错误。我在哪里得到这个错误,为什么数据库没有初始化,并允许我对它执行操作 错误: I/flutter ( 5420): NoSuchMethodError: The method 'insert' was called on null. I/flutter ( 5420): Receiver: null I/flutter ( 5420): Tried calling: inser

当我从api获取数据时,我从ui调用数据库帮助器类,这些数据必须转储到数据库中才能在应用程序中脱机使用。我得到了这个错误。我在哪里得到这个错误,为什么数据库没有初始化,并允许我对它执行操作

错误:

I/flutter ( 5420): NoSuchMethodError: The method 'insert' was called on null.
I/flutter ( 5420): Receiver: null
I/flutter ( 5420): Tried calling: insert("Deliveries", _LinkedHashMap len:6, conflictAlgorithm: Instance of 'ConflictAlgorithm')
E/flutter ( 5420): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method 'query' was called on null.
E/flutter ( 5420): Receiver: null
E/flutter ( 5420): Tried calling: query("Deliveries")
E/flutter ( 5420): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter ( 5420): #1      TodoHelper.getAllTask (package:delivery_app_odoo_flutter/utils/db_todays_deliveries_model.dart:110:55)
E/flutter ( 5420): #2      _TodayDeliveriesState.inertInDb (package:delivery_app_odoo_flutter/ui/deliveries_page/today_deliveries_page.dart:49:22)
E/flutter ( 5420): <asynchronous suspension>
E/flutter ( 5420): #3      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1102:15)
E/flutter ( 5420): #4      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1049:9)
E/flutter ( 5420): #5      SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:957:5)
E/flutter ( 5420): #6      _rootRun (dart:async/zone.dart:1126:13)
E/flutter ( 5420): #7      _CustomZone.run (dart:async/zone.dart:1023:19)
E/flutter ( 5420): #8      _CustomZone.runGuarded (dart:async/zone.dart:925:7)
E/flutter ( 5420): #9      _invoke (dart:ui/hooks.dart:259:10)
E/flutter ( 5420): #10     _drawFrame (dart:ui/hooks.dart:217:3)
E/flutter ( 5420): 
数据库帮助器类:

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    TodoHelper.dba.initDatabase();
    todayDeliveries=TodayDeliveriesModel();
    listProp = todayDeliveries.props;
//    todoHelper=TodoHelper();
    insertDataInDB();
  }

  insertDataInDB()async{
    await TodoHelper.dba.insertTask(listProp);
    WidgetsBinding.instance.addPostFrameCallback(getFromDb);
  }

  void getFromDb(Duration timeStamp) async{
    await TodoHelper.dba.getAllTask().then((val){
      setState(() {
        val.forEach((v){
          dbList.add(v);
        });
      });
    });
  }
  class TodoHelper{
  Database _db;

  TodoHelper._();

  static final TodoHelper dba = TodoHelper._();


  Future<Database> get database async {
    if (_db != null) return _db;
    // if _database is null we instantiate it
    _db = await initDatabase();
    return _db;
  }


  Future initDatabase() async{
    return await openDatabase(
        join(await getDatabasesPath(), "test.db"),
        onCreate: (db, version)async{
//          return _createDb(db);
          await db.execute("CREATE TABLE $tableName($Column_id INTEGER PRIMARY KEY AUTOINCREMENT, $Column_address TEXT, $Column_CustomerName TEXT, $Column_orderNumber TEXT, $Column_total TEXT,$Column_allItems TEXT,$Column_pending TEXT)");
        },
        version: 1
    );
  }

  Future<void> insertTask(List<TodayDeliveriesModel> task) async{
    final Database = await _db;
    try{
      task.forEach((val){
        Database.insert(tableName, val.toMap(), conflictAlgorithm: ConflictAlgorithm.replace);
      });

    }catch(_){
      print(_);
    }
  }


  Future<List<TodayDeliveriesModel>> getAllTask () async{
    final List<Map<String, dynamic>> tasks = await _db.query(tableName);

    return List.generate(tasks.length, (i){
      return TodayDeliveriesModel(address: tasks[i][Column_address],total: tasks[i][Column_total],allItems: tasks[i][Column_allItems],
          CustomerName:tasks[i][Column_CustomerName] ,orderNumber: tasks[i][Column_orderNumber],pending: tasks[i][Column_pending] );
    });
  }


}
class TodoHelper{
数据库(db),;
TodoHelper.();
静态最终TodoHelper dba=TodoHelper.uz();
未来获取数据库异步{
if(_db!=null)返回_db;
//如果_数据库为空,则实例化它
_db=await initDatabase();
返回_db;
}
Future initDatabase()异步{
返回等待openDatabase(
加入(等待getDatabasesPath(),“test.db”),
onCreate:(数据库,版本)异步{
//返回_createDb(db);
wait db.execute(“创建表$tableName($Column_id INTEGER主键自动递增,$Column_地址文本,$Column_客户名称文本,$Column_订单号文本,$Column_总计文本,$Column_allItems文本,$Column_挂起文本)”);
},
版本:1
);
}
未来插入任务(列表任务)异步{
最终数据库=等待_db;
试一试{
task.forEach((val){
insert(tableName,val.toMap(),conflictAlgorithm:conflictAlgorithm.replace);
});
}接住{
印刷品();;
}
}
未来的getAllTask()异步{
最终列表任务=等待数据库查询(tableName);
返回列表.生成(tasks.length,(i){
返回TodayDeliveriesModel(地址:tasks[i][Column\u address],总计:tasks[i][Column\u total],allItems:tasks[i][Column\u allItems],
客户名称:任务[i][Column\u客户名称],订单号:任务[i][Column\u订单号],待定:任务[i][Column\u待定];
});
}
}
initDatabase()
async
但在
ToDoHelper
中,它没有被等待。这里的问题是
initDatabase()
在构造函数中,不能是
async
或使用
wait
。我有一个类似的类来处理我的应用程序数据库,它等待需要数据库,然后打开数据库并将其保存到
\u db
变量,或者如果数据库以前已打开,则返回
\u db
变量。这是因为它确保在尝试访问数据库之前返回正确的未来

class TodayDeliveriesModel extends Equatable{
  String address;
  String CustomerName;
  String orderNumber;
  String total;
  List<ItemsModel> allItems;
  bool pending;

  TodayDeliveriesModel({this.address, this.CustomerName,this.orderNumber, this.allItems, this.total, this.pending});

  Map<String, dynamic> toMap(){
    return {
      Column_address : this.address,
      Column_CustomerName:this.CustomerName,
      Column_orderNumber:this.orderNumber,
      Column_total:this.total,
      Column_allItems:this.allItems?.map((e) =>
      e == null ? null : ItemsModel(quantity: e.quantity,name: e.name))
          ?.toList(),
      Column_pending:this.pending
    };
  }


  @override
  List<TodayDeliveriesModel> get props => deliveriesList;
}
如果从构造函数中删除
initDatabase()
,并替换
Database db
使用以下私有变量和异步getter,数据库应按预期工作

  static Database _db;

  // If there is no database in place then initialise one
  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }

    // Initialise db
    _db = await initDatabase();
    return _db;
  }
initDatabase()
async
的,但在
ToDoHelper
中没有等待它。这里的问题是
initDatabase()
在构造函数中,不能是
async
或使用
wait
。我有一个类似的类来处理我的应用程序数据库,它等待需要数据库,然后打开数据库并将其保存到
\u db
变量,或者如果数据库以前已打开,则返回
\u db
变量。这是因为它确保在尝试访问数据库之前返回正确的未来

class TodayDeliveriesModel extends Equatable{
  String address;
  String CustomerName;
  String orderNumber;
  String total;
  List<ItemsModel> allItems;
  bool pending;

  TodayDeliveriesModel({this.address, this.CustomerName,this.orderNumber, this.allItems, this.total, this.pending});

  Map<String, dynamic> toMap(){
    return {
      Column_address : this.address,
      Column_CustomerName:this.CustomerName,
      Column_orderNumber:this.orderNumber,
      Column_total:this.total,
      Column_allItems:this.allItems?.map((e) =>
      e == null ? null : ItemsModel(quantity: e.quantity,name: e.name))
          ?.toList(),
      Column_pending:this.pending
    };
  }


  @override
  List<TodayDeliveriesModel> get props => deliveriesList;
}
如果从构造函数中删除
initDatabase()
,并替换
Database db
使用以下私有变量和异步getter,数据库应按预期工作

  static Database _db;

  // If there is no database in place then initialise one
  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }

    // Initialise db
    _db = await initDatabase();
    return _db;
  }

是否检查数据库帮助器类的insertTask和getAllTask方法中的db对象是否为Null我是否在ui代码中以正确的方式调用数据库帮助器?是否检查数据库帮助器类的insertTask和getAllTask方法中的db对象是否为Null我是否在ui代码中以正确的方式调用数据库帮助器?我已更新我的数据库助手类和从ui调用,但仍然得到相同的错误。你现在可以查看最新的代码(我编辑了我的帖子)谢谢你尝试我的答案!在
insertTask
中更新的帖子中有一些语法错误。第一行应该是
final database=wait database
最终数据库=等待_db
然后是
Database.insert(
应该是
Database.insert(
.final dtbase=await db;现在我在我的代码中使用这一行。我使用名为db的数据库实例如果你使用的是
dtbase=await db;
那么你的insert语句应该是
dtbase。insert
我的模型可以吗?我更新了我的数据库助手类并从ui调用了它,但仍然得到相同的错误。你现在可以检查最近的错误st code(我编辑了我的帖子)谢谢你尝试我的答案!你在
insertTask
中更新的帖子中有一些语法错误。第一行应该是
final database=await database;
不是
final database=await\u db;
然后是
database.insert(
应该是
database.insert(
.final dtbase=await db;现在我在我的代码中使用这一行。我使用名为db的数据库实例如果您使用的是
dtbase=await db;
那么您的insert语句应该是
dtbase。insert
我的模型可以吗?