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

Flutter组件启动时触发Null Exception,可打印值却报错求排查

Flutter启动时Null异常问题解决

问题现象

启动Flutter应用触发Null异常,推测为空变量访问导致,进入EventsList组件时触发错误。打印用户相关数据可正常输出,但EventsList中处理Firestore数据时抛出异常。

相关代码

Home类

class Home extends StatelessWidget {
  final AuthService _auth = AuthService();

  Home({super.key});


  @override
  Widget build(BuildContext context) {
    return StreamProvider<QuerySnapshot?>.value(
      value: DataBaseService().events,
      initialData: null,
      child: Scaffold(
        backgroundColor: Colors.brown[300],
        appBar: AppBar(
          title: Text("Home Title"),
          elevation: 0.0,
          backgroundColor: Colors.brown[500],
          actions: <Widget>[
            TextButton(
              onPressed: () {},
              child: Icon(Icons.person),
            ),
            TextButton(
              onPressed: () async {
                await _auth.signOut();
              },
              child: Icon(Icons.logout),
            )
          ],
        ),
        body: EventsList(),
      ),
    );
  }
}

EventsList类(State部分)

class _EventsListState extends State<EventsList> {
  @override
  Widget build(BuildContext context) {
    
    final events = Provider.of<QuerySnapshot?>(context);
    print(events);
    for (var e in events!.docs) {
      final data = e.data() as Map<String, dynamic>;
      print(data['eventName']);
      print(data);
    }
    return Container();
  }
}

DataBaseService类

class DataBaseService {
  final String? userID;

  DataBaseService({this.userID});

  final CollectionReference eventsCollection =
      FirebaseFirestore.instance.collection('event');

  Future updateUserData(String eventName, double cost, String age) async {
    return await eventsCollection
        .doc(userID)
        .set({'eventName': eventName, 'cost': cost, 'age': age});
  }

  Stream<QuerySnapshot>? get events {
    return eventsCollection.snapshots();
  }
}

问题原因

核心问题在于强制解包null值:

  • StreamProvider的initialData设为null,且Firestore流在初始化阶段尚未返回数据时,events变量为null
  • 代码中使用events!.docs强制解包,直接触发Null异常

解决方案

修改EventsList的build方法,增加空安全判断:

class _EventsListState extends State<EventsList> {
  @override
  Widget build(BuildContext context) {
    
    final events = Provider.of<QuerySnapshot?>(context);
    print(events);
    
    // 先处理events为null的情况,显示加载状态
    if (events == null) {
      return const Center(child: CircularProgressIndicator());
    }
    
    // 确认events非空后再遍历文档
    for (var e in events.docs) {
      final data = e.data() as Map<String, dynamic>;
      print(data['eventName']);
      print(data);
    }
    return Container();
  }
}

额外优化建议:

  • 可结合null-aware操作符简化代码,比如events?.docs?.forEach(...)避免空指针
  • 检查Firestore的event集合是否存在,确保流能正常返回数据

内容的提问来源于stack exchange,提问作者Geremia Moretti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:47:04