Flutter中判断Provider内Object?类型状态值是否为空报错如何解决
问题根因
两个问题都是类型声明和Dart语法特性导致的:
- 编译报错
The getter 'isEmpty' isn't defined for the type 'Object':你将session声明为Object?类型,Dart静态类型系统中Object作为所有类型的公共根类,本身没有定义isEmpty属性,该属性只存在于Map、List、String等具体类型上,因此编译器直接禁止调用。 - 空判断失效:Dart中
{}会创建一个新的Map实例,默认的对象相等判断是引用相等,你初始化_session时赋值的{}和判断逻辑里写的{}是两个完全独立的实例,哪怕内容都是空Map,content.session != {}的判断结果永远为true,自然无法命中EmptyScreen()的渲染分支。
修复方案
方案1(推荐):使用明确类型声明
如果你的session存储的始终是Map类型数据,直接把类型从Object?改为Map,从根源解决类型安全问题:
// 状态类中session属性修改 Map _session = {}; Map get session => _session; set session(Map newValue) { _session = newValue; notifyListeners(); }
对应的渲染判断逻辑直接用isEmpty即可,不需要额外类型判断:
content.session.isEmpty ? const EmptyScreen() : const CurrentScreen()
方案2:兼容多类型存储场景
如果你确实需要用Object?存储多种类型的值(可能是Map、字符串、列表等),调用属性前必须先做类型校验,同时禁止用新建空实例的方式做相等判断:
// 提前判断session是否为空 bool sessionIsEmpty = content.session == null; if (!sessionIsEmpty) { final s = content.session; if (s is Map || s is String || s is Iterable) { sessionIsEmpty = s.isEmpty; } // 如果还有其他可能存储的类型,在这里补充对应判断分支即可 } // 渲染逻辑 sessionIsEmpty ? const EmptyScreen() : const CurrentScreen()
注意:不要在未做类型检查的情况下对
Object?类型值做强制类型转换调用具体类型的方法,否则会抛出运行时类型错误。
内容的提问来源于stack exchange,提问作者AlienDecoy
相关产品推荐
相关产品推荐

