Flutter中Dialog返回实例调用getter报错,initState中正常问题排查
问题分析与解决方案
你遇到的问题核心是泛型参数命名冲突,导致代码里的value并没有被识别为你定义的MyReaction类实例,而是被当成了一个泛型占位符类型,自然找不到对应的getter方法。
错误根源
看你定义的showDemoDialog方法:
void showDemoDialog<MyReaction>({ BuildContext context, Widget child }) { // ... }
这里的<MyReaction>是一个泛型类型参数的名称,和你自己创建的MyReaction类同名了。这就导致在then回调里的value类型是这个泛型占位符,而不是你实际的MyReaction类,所以编译器不知道value有iconD和textV这两个getter。
而initState里能正常运行,是因为那里直接引用的是你定义的MyReaction类实例,没有泛型命名冲突的问题。
修复方案
有两种简单的修复方式,选一种即可:
方案1:移除不必要的泛型参数
因为你已经明确showDialog返回的是MyReaction类型,不需要泛型,直接修改方法定义:
void showDemoDialog({ BuildContext context, Widget child }) { showDialog<MyReaction>( context: context, builder: (BuildContext context) => child, ) .then<void>((MyReaction value) { if (value != null) { setState(() { _myreactionIcon = value.iconD; // 现在可以正常访问了 _myreactionText = value.textV; }); } }); }
方案2:修改泛型参数名称避免冲突
如果你确实需要保留泛型(比如以后可能扩展其他类型),把泛型参数改成不同的名字,比如<T>:
void showDemoDialog<T>({ BuildContext context, Widget child }) { showDialog<T>( context: context, builder: (BuildContext context) => child, ) .then<void>((T value) { if (value != null && value is MyReaction) { setState(() { _myreactionIcon = value.iconD; _myreactionText = value.textV; }); } }); }
这种方式需要加个类型判断value is MyReaction,确保类型安全。
额外优化建议
另外,你可以把MyReaction类的成员变量直接改成公开的(去掉下划线),这样就不需要额外的getter方法,代码更简洁:
class MyReaction { IconData icon; String text; MyReaction(this.icon, this.text); }
之后访问的时候直接用value.icon和value.text就可以了,减少不必要的代码。
内容的提问来源于stack exchange,提问作者p2hari
相关产品推荐
相关产品推荐

