You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter项目遇Null check operator报错,移除!后加载无响应求助

问题分析与修复方案

核心问题拆解

  1. 空检查崩溃:ApiService().GetUserProjectSpecificDay()返回了null,你用!强制断言非空,直接触发null check operator used on a null value错误。
  2. 无限加载:你把_userModel初始化为空列表[],导致UI判断条件_userModel == null || _userModel!.isEmpty永远为true(空列表的isEmpty是true),所以一直显示加载指示器。

分步修复代码

1. 修正状态变量与数据更新逻辑

  • 把_userModel初始化为null,明确表示“未加载”状态
  • 在_getData中必须调用setState,否则UI不会感知到数据变化

2. 安全处理API返回值

  • 移除!强制断言,改用空合并运算符??处理null情况,同时添加错误捕获逻辑

3. 优化UI状态判断

  • 区分“加载中(_userModel为null)”、“加载后无数据(空列表)”、“加载成功(有数据)”三种状态

修改后的LoginScreen.dart代码

import 'package:flutter/material.dart';
import 'package:c3mobiredo/connectivity/apiConfig.dart';
import 'package:c3mobiredo/connectivity/models/getTimesheetForUserDay.dart';
import '../connectivity/Services/api_service.dart';

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

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  // 初始化为null,表示未加载状态
  List<UserProjectSpecificDay>? _userModel;
  // 可选:添加错误状态变量,展示加载失败信息
  String? _errorMessage;

  @override
  void initState() {
    super.initState();
    _getData();
  }

  void _getData() async {
    try {
      final response = await ApiService().GetUserProjectSpecificDay();
      setState(() {
        // 用空合并运算符处理null,返回空列表避免后续空指针
        _userModel = response ?? [];
        _errorMessage = null;
      });
    } catch (e) {
      setState(() {
        _userModel = [];
        _errorMessage = '加载失败:$e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('REST API Example'),
      ),
      body: _buildBody(),
    );
  }

  Widget _buildBody() {
    // 加载中状态
    if (_userModel == null) {
      return const Center(child: CircularProgressIndicator());
    }
    // 错误状态
    if (_errorMessage != null) {
      return Center(child: Text(_errorMessage!));
    }
    // 无数据状态
    if (_userModel!.isEmpty) {
      return const Center(child: Text('暂无数据'));
    }
    // 有数据状态
    return ListView.builder(
      itemCount: _userModel!.length,
      itemBuilder: (context, index) {
        final item = _userModel![index];
        return Card(
          child: Column(
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Text(item.id.toString()),
                  Text(item.project.projectName),
                ],
              ),
              const SizedBox(height: 20.0),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Text(item.hours),
                  Text(item.desc),
                ],
              ),
            ],
          ),
        );
      },
    );
  }
}

额外建议

  • 检查ApiService().GetUserProjectSpecificDay()的实现,确认返回null的原因(比如网络错误、API返回空、解析失败)
  • 可以添加网络状态监听,避免在无网络时发起无效请求
  • 对于嵌套对象(比如item.project),建议补充空检查,避免潜在的空指针错误

内容的提问来源于stack exchange,提问作者Oluwaseun Fabiyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:15:54