dart 从本地数据库提取数据后出现空错误

wecizke3  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(135)

我有一个数据库与一些个人资料信息,我想加载他们在我的 Jmeter 板登录后。这里是我的代码在我的 Jmeter 板屏幕。

class __DashboardPageState extends State<_DashboardPage> {

  UserClass userObject;
  var db;

  __DashboardPageState(){
    getUserObj();
  }
  void getUserObj() async{
    db = new DatabaseHelper();
    userObject = await db.fetchUsers();
  }

//-----------------

  @override
  Widget build(BuildContext context) {
    getUserObj();

    Container(
      padding: const EdgeInsets.only(bottom: 8),
      child: new Text(
        "Welcome Back, "+ userObject.firstname,
        style: TextStyle(
          fontFamily: "Yorkten_ConMed",
          fontSize: 14,
          color: Color(0xffffffff),
        ),
      ),
    )

对null调用了getter "firstname"。接收方:空尝试呼叫:名
在我的控制台和屏幕中获取此错误显示错误,如附件。我知道由于异步,它在屏幕绘制之前没有初始化。但我不知道如何从数据库中拉取和加载我的小部件中的数据。

sgtfey8w

sgtfey8w1#

您需要在加载数据时处理小部件的可见性。

  • 不要使用构造函数AfterLayout来加载数据,一旦从DB中获取数据,就执行setState
  • 您可以使用包screen_loader在加载数据时显示loader。
  • 您需要处理可能的空值

很明显,userObject最初将为null,因此当您使用userObject的属性时,请按如下方式使用:userObject?.firstname ?? '-',此处如果userObjectfirstname为空,则返回'-'

zkure5ic

zkure5ic2#

我建议你使用FutureBuilder而不是StatefulWidget页面,这样你就可以只重新加载发生变化的项目,这样做可以保存一些资源,也可以修复你的问题。在将来使用数据库调用db.fetchUsers(),并使用如下代码:

if (!snapshot.hasData) {
          return const Center(
           child: Center(child: CircularProgressIndicator()),
                                );
                              } else if (snapshot.hasError) {
                                return Center(
                                  child: Text(snapshot.error.toString()),
                                );
                              } 
             else {
                  //return your Widget here
                  }

您可以稍后在snapshot.hasData时验证此数据是否为空,并像snapshot.data.firstname ?? 'No name'一样做出相应的React

相关问题