Flutter中Stack用Positioned出现'size.isFinite': is not true断言错误排查
Flutter Stack + Positioned 触发 'size.isFinite' 断言错误的原因及解决办法
你遇到的这个断言错误,核心问题是Stack没有被赋予明确的尺寸约束。当Stack的子组件只有Positioned元素时,Stack会尝试根据子组件的位置和大小计算自身尺寸,但Positioned的top/left是相对父容器的偏移量,此时Stack没有自身的边界限制,会被判定为无限大尺寸,从而触发size.isFinite的断言检查失败。
看你的代码,直接返回Stack却没有给它设置任何尺寸限制,这就是错误根源。
解决办法
给Stack添加明确的尺寸约束,常见的两种方式:
1. 让Stack占满父容器/屏幕
通过MediaQuery获取屏幕尺寸,或者用Expanded(在Column/Row布局中)让Stack填充可用空间:
double width = 200.0; double height = 80.0; double top = 100; double left = 100; @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; return SizedBox( width: screenSize.width, height: screenSize.height, child: Stack( children: [ Positioned( top: top, left: left, child: GestureDetector( onPanUpdate: (details) { setState(() { top += details.delta.dy; left += details.delta.dx; }); }, child: Container( height: height, width: width, color: Colors.blue, ), ), ), ], ), ); }
2. 给Stack设置固定尺寸
用SizedBox包裹Stack,指定固定宽高:
@override Widget build(BuildContext context) { return SizedBox( width: 300, height: 300, child: Stack( children: [ // 你的Positioned子组件代码 ], ), ); }
内容的提问来源于stack exchange,提问作者Harsh Rajpara
相关产品推荐
相关产品推荐

