flutter - 如何使 Widget 尽可能小(Android 中的 wrap_content)?
问题描述
我有一个类似于Column
>>的渲染树的渲染问题,其中最后一个位于PageView
.Column
Column
PageView
PageView
没有正确呈现,所以我得到一个异常()Horizontal viewport was given unbounded height.
,因为框架无法计算它的大小,我可以通过将它包装成 aFlexible
或 an来修复它Expanded
,但我不希望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
总是试图保持它与重量的比例,这意味着对于较小的显示器,它不会消失,它会保留在那里,而第一个和所需的图像不会有这样的空白空间. 如下图所示,Spacer 始终存在。此外,我必须计算此设计中每次更改的因素,而在我的第一个代码示例中,小部件将自动调整到屏幕中心。Flexible
Expanded
flex
Spacer
flex
我怎样才能指示PageView
它尽可能小,而不是尽可能多地扩展,因为这是我可以在网上找到的唯一解决方案?
解决方案
环绕给定的PageView
用途。SliverFillViewport
children
这SliverFillViewport
不关心它们有多小children
。它只关心它可以从其父级占据多少空间。所以Flex
andAlign
小部件是没用的。
目前,除非我们进行一些计算并使用or PageView
,否则这很可能是不可能的。SizedBox
ConstrainedBox
我也发现了这个讨论
推荐阅读
- powershell - 将两个 Powershell 命令的输出添加到数组中
- python - 如何忽略海底小提琴情节中的异常值?
- angular - 如何在ngrx的影响中执行地图运算符?
- apache-kafka - 阿帕奇卡夫卡和传奇
- python - 无法让 pyinstaller 使用 --onefile 和 --noconsole
- javascript - 标题上的 Kendo Grid 复选框未选择所有行
- kubernetes - 我如何保证多实例服务只接收一次事件?
- c# - 将数据输入 Excel 并使用 Out Microsoft.Office.Interop.Excel Service C# 打印出来
- apache - 如何修复 Tomcat 9 上的目录遍历漏洞
- mysql - Alfresco 错误:org.alfresco.error.AlfrescoRuntimeException: 07240001 事务中的异常