问题描述
我正在尝试构建一个具有默认高度的可展开小部件,如果子小部件的高度大于此高度,则会显示“展开”按钮。如果没有必要,我不希望显示按钮。如果我给父母一个身高并测量孩子,我总是得到与父母相同的身高。有没有办法获得裁剪的子小部件的高度?我使用 measured_size 包,它使用 addPostFrameCallback 从上下文中获取孩子的大小。这是我的代码:
Container(
height: 80,child: ClipRect(
child: MeasuredSize(
onChange: (size) => print(size.height),child: Container(height: 160,color: Colors.red),)
)
)
编辑 如果它可以帮助某人;这就是我最终解决这个问题的方式;我放弃了 measused_size 包并使用了 Offstage 小部件。我在 Offstage 中放置了一个不受限制的“MyDynamicallyLongWidget”以获得它的真实高度。这个不会被画在屏幕上。我还将它放在所需默认高度的剪辑框中。这将被画在屏幕上。 EXPAND 文本包含在 ValueListenableBuilder 中,以根据“MyDynamicallyLongWidget”的高度与所需的默认高度进行比较来显示或隐藏。下面的代码只关心 EXPAND 文本的显示逻辑,而不是实际的展开。为此,我使用了 expandable。
class ExpandableText extends StatefulWidget {
final String text;
ExpandableText({this.text});
@override
_ExpandableTextState createState() => _ExpandableTextState();
}
class _ExpandableTextState extends State<ExpandableText> {
final GlobalKey _childKey = GlobalKey();
ValueNotifier<double> childHeight = ValueNotifier(0);
void postFrameCallback(_) async {
final RenderBox renderChild = _childKey.currentContext.findRenderObject() as RenderBox;
childHeight.value = renderChild.size.height;
}
@override
Widget build(BuildContext context) {
SchedulerBinding.instance.addPostFrameCallback(postFrameCallback);
final double defaultHeight = 82.0;
return Column(
children: [
Offstage(
offstage: true,child: MyDynamicallyLongWidget(key: _childKey,data: widget.text)
),ClipRect(
child: Container(height: defaultHeight,child: MyDynamicallyLongWidget(data: widget.text),),ValueListenableBuilder(
builder: (context,height,child) {
return height <= defaultHeight ?
Container() :
Text("EXPAND",style: TextStyle(color: Theme.of(context).accentColor));
},valueListenable: childHeight,],);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)