我正在尝试将ClipRect与Column一起使用,但效果似乎不太好。
我想要实现的是裁剪列的内容并在出现溢出时显示文本消息(如果无法在可用空间中显示列的内容)。
您对我如何实现它有任何建议吗?
import 'package:flutter/material.dart';
void main() => runApp(ContentOverflowDetectionApp());
class ContentOverflowDetectionApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Overflow detection"),
),
body: Stack(
fit: StackFit.expand,
children: [
ClipRect(
child: Column(
children: [
Container(
width: 300,
height: 400,
color: Colors.green[200],
child: Text('first widget'),
),
Container(
width: 350,
height: 350,
color: Colors.yellow[200],
child: Text('overflowed widget'),
),
],
),
),
Positioned(
child: Align(
alignment: FractionalOffset.bottomCenter,
child: Text("SHOW THIS TEXT ONLY IF CONTENT HAS OVERFLOWED."),
),
),
],
),
),
);
}
}
答案 0 :(得分:0)
您不应将ClipRect用于目标。请尝试将溢出参数Overflow.clip添加到Stack小部件。
import 'package:flutter/material.dart';
void main() => runApp(ContentOverflowDetectionApp());
class ContentOverflowDetectionApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Overflow detection"),
),
body: Stack(
fit: StackFit.expand,
overflow: Overflow.clip,
children: [
Positioned(
top: 0,
child: Column(
children: [
Container(
width: 300,
height: 400,
color: Colors.green[200],
child: Text('first widget'),
),
Container(
width: 350,
height: 350,
color: Colors.yellow[200],
child: Text('overflowed widget'),
),
],
),
),
Positioned(
child: Align(
alignment: FractionalOffset.bottomCenter,
child: Text("SHOW THIS TEXT ONLY IF CONTENT HAS OVERFLOWED."),
),
),
],
),
),
);
}
}
此解决方案仅可修复剪辑。
How to get a height of a Widget?给出了如何检查小部件高度并添加带有溢出消息的文本的答案
答案 1 :(得分:0)
对于那些想要“高度限制器”(限制其孩子高度的小部件,如果孩子想要太高,请显示一些提示)的人,这是我的代码片段,您可以复制并-粘贴:
class HeightLimiter extends StatefulWidget {
final Widget child;
final double maxHeight;
final double fadeEffectHeight;
const HeightLimiter({Key key, this.maxHeight, this.child, this.fadeEffectHeight = 72}) : super(key: key);
@override
_HeightLimiterState createState() => _HeightLimiterState();
}
class _HeightLimiterState extends State<HeightLimiter> {
var _size = Size.zero;
@override
Widget build(BuildContext context) {
return ConstrainedBox(
constraints: BoxConstraints(
maxHeight: widget.maxHeight,
),
child: Stack(
clipBehavior: Clip.hardEdge,
children: [
Positioned(
top: 0,
left: 0,
right: 0,
child: MeasureSize(
onChange: (size) => setState(() => _size = size),
child: widget.child,
),
),
if (_size.height >= widget.maxHeight)
Positioned(
bottom: 0,
left: 0,
width: _size.width,
child: _buildOverflowIndicator(),
),
],
),
);
}
Widget _buildOverflowIndicator() {
return Container(
height: widget.fadeEffectHeight,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: [
Colors.white.withAlpha(200),
Colors.white.withAlpha(0),
],
tileMode: TileMode.clamp,
),
),
);
}
}
而 MeasureSize
刚好来自 https://stackoverflow.com/a/60868972/4619958。
当孩子太高时,结果如下(绿色孩子溢出蓝色父母);当孩子足够矮时,不会显示任何特殊内容。
感谢@Aleksandr 和@Dpedrinha 的回答!