flutter - 当子项的大小超过屏幕大小时处理堆栈
问题描述
当孩子的尺寸小于屏幕尺寸时,使用 Stack 很容易控制布局。但是当孩子的身高大于屏幕尺寸时,就需要使用SingleChildScrollView
. 但是如果我使用它,整个屏幕会变白并产生如下所示的错误。
在这些情况下使用Stack
&时如何处理布局。SingleChildScrollView
任何帮助是极大的赞赏。谢谢你。
示例代码
import 'package:flutter/material.dart';
void main(List<String> args) {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Container(
child: SingleChildScrollView(
child: Stack(
fit: StackFit.expand,
children: [
_Background(),
Positioned(left: 0, top: 100, child: WidgetA()),
Positioned(left: 0, top: 270, child: WidgetB()),
],
),
),
),
),
);
}
}
class _Background extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.red,
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
);
}
}
class WidgetA extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: randomHeight(),
width: MediaQuery.of(context).size.width,
color: Colors.purple,
child: Center(
child: Text('Widget A'),
),
);
}
}
class WidgetB extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 250,
width: MediaQuery.of(context).size.width,
color: Colors.yellow,
child: Center(
child: Text('Widget B'),
),
);
}
}
错误
════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: RenderRepaintBoundary#2e73f relayoutBoundary=up1 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1940 pos 12: 'hasSize'
The relevant error-causing widget was
Scaffold
lib/main.dart:11
════════════════════════════════════════════════════════════════════════════════
解决方案
原因:
SingleChildScrollView 提供无限空间。
堆栈自己调整大小以包含所有未定位的子项,这些子项根据对齐方式进行定位(在从左到右的环境中默认为左上角,在从右到左的环境中默认为右上角)。然后根据它们的 top、right、bottom 和 left 属性相对于堆栈放置定位的子项。
小部件永远膨胀。
它还会导致 StackRender 算法出现问题,因为这将处理 Zenith。
解决方案给它一个约束,例如 SizedBox();
推荐阅读
- python-3.x - pandas,如何将任何包含单词的列转换为数字(即映射它们)?
- express - 为 vue 配置 webpack,使后端 express 服务器位于 ECMA2016 中
- php - 全球期权价格更新 Opencart
- r - ggplot2 - 注释外部情节
- ssh - 如何强制使无人机 CI 失败
- nativescript - 如何跟踪列表中多个 Switch 元素的“checkedChange”事件?
- sql - 无论年份如何计算生日日期
- r - R编程(初学者):组合两个列表->数据框-> csv
- javascript - PHOTOSHOP/JSX:如何有效地检查工具是否被使用
- python - 将推文存储到 csv 文件时出现问题