【发布时间】:2020-04-05 05:52:35
【问题描述】:
我遇到了类似于Column>PageView>Column 的渲染树的渲染问题,其中最后一个Column 在PageView 的页面内。
PageView 未正确呈现,所以我得到一个异常 (Horizontal viewport was given unbounded height.),因为框架无法计算其大小,我可以通过将其包装成 Flexible 或 @987654335 来修复它@,但我不希望PageView 占据整个屏幕,我希望它尽可能小并位于屏幕中心。
这是我的问题的表示:
// This code throws an exception:
class Widget_1_Has_Problem extends StatelessWidget {
final PageController pageController = PageController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.done,size: 112),
SizedBox(height: 32),
PageView(
physics: NeverScrollableScrollPhysics(),
controller: pageController,
children: <Widget>[
// Many widgets go here, I am just simplifying with a Column.
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text('TEXT TEXT TEXT TEXT TEXT TEXT'),
SizedBox(height: 16),
Text('TEXT2 TEXT2 TEXT2 TEXT2 TEXT2 TEXT2'),
],
),
],
),
],
),
);
}
}
这就是我想要实现的(我删除了PageView 以显示它):
class Widget_2_No_PageView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.done,size: 112),
SizedBox(height: 32),
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text('TEXT TEXT TEXT TEXT TEXT TEXT'),
SizedBox(height: 16),
Text('TEXT2 TEXT2 TEXT2 TEXT2 TEXT2 TEXT2'),
],
),
],
),
);
}
}
这是我可以解决的方法,但它并不完美,我稍后会展示:
class Widget_3_With_Flex_Not_Perfect_Solution extends StatelessWidget {
final PageController pageController = PageController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Spacer(flex: 2,),
Icon(Icons.done,size: 112),
SizedBox(height: 32),
Flexible(
flex: 1,
child: PageView(
physics: NeverScrollableScrollPhysics(),
controller: pageController,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text('TEXT TEXT TEXT TEXT TEXT TEXT'),
SizedBox(height: 16),
Text('TEXT2 TEXT2 TEXT2 TEXT2 TEXT2 TEXT2'),
],
),
],
),
),
Spacer(flex: 2,),
],
),
);
}
}
这个解决方案并不完美,因为Spacer 和Flexible 或Expanded 总是试图保持它与flex 权重的比例,这意味着对于较小的显示器Spacer 不会消失,它将保留在那里,而第一个和所需的图像不会有这样的空白空间。如下图所示,Spacer 始终存在。此外,我必须为这个设计中的每一个变化计算 flex 因子,而在我的第一个代码示例中,小部件将自动调整到屏幕中心。
我怎样才能指示PageView 尽可能小,而不是随心所欲地扩展,因为这是我能在网上找到的唯一解决方案?
【问题讨论】:
-
试过
IntrinsicHeight? -
不,我没有,据我所知,
IntrinsicHeight使Row中的所有小部件都具有相同的大小 -
文档说:“一个将其子级大小调整为子级固有高度的小部件。此类很有用,例如,当无限高度可用并且您想要一个孩子时尝试无限扩展以将自身调整到更合理的高度。”
-
哦,这听起来很有希望,我只是从示例中知道的。命名应该更具描述性,“内在”是非常技术性的,大多数外国人甚至都不知道它是什么意思
-
@pskink 我刚刚尝试了
IntrinsicHeight,但它不起作用......它对你有用吗?