GetX中响应式bool值为false时,如何避免返回空Widget?
解决GetX响应式变量控制Widget显示/不显示的问题
在Flutter中,Widget树不允许直接返回null,所以不能直接在条件不满足时返回空。不过可以通过以下几种方式实现"完全不显示任何内容"的效果,比返回SizedBox.shrink()更优雅:
方法一:使用Visibility组件包裹目标Widget
把需要控制显示的Widget放在Visibility里,通过visible参数绑定你的响应式bool变量,同时设置maintainState: false可以在不显示时销毁子组件,节省资源:
Obx(() { return Visibility( visible: rxBool.value, maintainState: false, // 不显示时释放子组件状态,优化性能 child: Positioned( right: 45.0, bottom: constraints.maxHeight / 4 + 85, child: GestureDetector( onTap: () => controller.toggleTooltip(), child: SomeWidgetIWantToShow(), ), ), ); })
方法二:利用Obx结合空数组技巧(适用于多Widget场景)
如果是在Stack这类可以接收多个子组件的父Widget里,还可以通过返回一个空的组件列表来实现:
Stack( children: [ // 其他固定子组件 ...Obx(() => rxBool.value ? [ Positioned( right: 45.0, bottom: constraints.maxHeight / 4 + 85, child: GestureDetector( onTap: () => controller.toggleTooltip(), child: SomeWidgetIWantToShow(), ), ) ] : []), ], )
这种方式当变量为false时,不会向Stack中添加任何子组件,完全没有多余元素。
补充说明
直接返回null会触发Flutter框架报错,因为Widget树的每个节点都必须是有效的Widget实例。上面两种方法既满足了"不显示任何内容"的需求,又符合Flutter的Widget树规则。
内容的提问来源于stack exchange,提问作者Koustuv Ganguly
相关产品推荐
相关产品推荐

