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

Bloc状态管理场景下,何时使用空对象而非Null对象?

Bloc状态管理中初始状态对象的赋值抉择:空对象 vs Null

问题场景

在Bloc状态管理的页面中,初始状态下不存在当前问题,纠结状态类中的question字段应该赋值空对象还是Null。参考Bloc官方示例后,倾向于使用空对象策略。

官方示例参考

Bloc官方库中通过定义空对象来处理无数据的初始状态,示例代码如下:

import 'package:equatable/equatable.dart';

class User extends Equatable {
  const User(this.id);

  final String id;

  @override
  List<Object> get props => [id];

  static const empty = User('-');
}

我的状态类实现

基于空对象策略,我的状态类代码如下:

class JLPTVoiceRecorderState extends Equatable {
  final JLPTVoiceRecorderStatus status;
  final LearningQuestion question;
  final File? voiceFile;

  @override
  List<Object?> get props => [status, question, voiceFile];

  const JLPTVoiceRecorderState({
    required this.status,
    required this.question,
    this.voiceFile,
  });
}

方案说明

选择空对象而非Null的核心优势:

  • 避免在UI层或业务逻辑中频繁做Null判断,减少空指针风险
  • 保持状态类字段的非空性,符合Dart的空安全规范,代码更健壮
  • 与Bloc官方推荐的实践保持一致,代码风格统一

要完整实现这个策略,需要给LearningQuestion类添加一个静态的空对象实例,示例如下:

class LearningQuestion extends Equatable {
  // 类原有属性与方法实现...
  
  static const empty = LearningQuestion(/* 传入标识空状态的默认值,比如空ID、空内容等 */);
}

之后在状态的初始构造中,直接传入LearningQuestion.empty即可完成初始状态的赋值。

内容的提问来源于stack exchange,提问作者Hoang Trung Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:27:43