Flutter 测量裁剪的小部件

问题描述

我正在尝试构建一个具有认高度的可展开小部件,如果子小部件的高度大于此高度,则会显示“展开”按钮。如果没有必要,我不希望显示按钮。如果我给父母一个身高并测量孩子,我总是得到与父母相同的身高。有没有办法获得裁剪的子小部件的高度?我使用 measured_size 包,它使用 addPostFrameCallback 从上下文中获取孩子的大小。这是我的代码

Container(
    height: 80,child: ClipRect(
        child: MeasuredSize(
            onChange: (size) => print(size.height),child: Container(height: 160,color: Colors.red),)
    )
)

enter image description here

编辑 如果它可以帮助某人;这就是我最终解决这个问题的方式;我放弃了 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 (将#修改为@)