容器高度监听器

Posted

技术标签:

【中文标题】容器高度监听器【英文标题】:Container height listener 【发布时间】:2020-07-26 05:17:30 【问题描述】:

我正在尝试构建一个可以放置在 listView 上的可重复使用的 searchBar。下面是它的外观示例

我已将 searchBar 绑定到 ScrollController,因此可以使用 AnimatedContainer 缩小容器的大小。

我遇到的问题是,在打开/关闭 SearchBar 时,子小部件不会优雅地消失/缩小或重新出现。下面是一个示例。

我试图对它们做一个 AnimatedOpacity,但看起来我需要在容器本身上绑定一个 AnimationController 来监听高度。

我可以附上代码,但我猜我的问题是采取的方法。

我在容器上尝试了 GlobalKey,但不是每个滚动事件都是 当我为容器的整个伸展设置动画时被捕获 拉了 50%(给人一种快活的感觉)。 我尝试了 SizeChangedLayoutNotifier 并收到了通知,但是当我 将其绑定到 RenderObject 以查找大小,我得到“构建计划 帧期间”错误。

还有其他想法吗?

【问题讨论】:

我会建议使用 CustomScroll 的 Slivers。否则尝试通过这个:blog.smartnsoft.com/… youtube.com/watch?v=FPcl1tu0gDs 我的 ListView 页面基于 Slivers。 SearchBar(一个可重复使用的有状态小部件)位于 SliverToBoxAdapter 中。 SearchBar 是一个带有 Row 元素的容器。 我已经在 pub.dev 中查看了可重复使用的 searchBars,例如 flappy,但它们都没有像 Whatsapp searchBar 或 ios 中默认邮件应用程序的 searchBar 的动画外观......打开并按下以快速关闭 如果你使用的是Sliver,使用这个属性:flexibleSpace 在弹性空间中,你可以放置你的widget。我也在应用程序中使用相同并且工作正常 【参考方案1】:

你可以按照这个教程https://www.youtube.com/watch?v=FPcl1tu0gDs

这是您预期结果的一个小例子:

SliverAppBar(
  expandedHeight: _width / 3.0,
  backgroundColor: Colors.white,
  leading: InkWell(
    onTap: () => Navigator.of(context).pop(),
    child: Container(
      alignment: Alignment.center,
      child: Container(
          width:  30,
          height: 30,
        alignment: Alignment.center,
          decoration: BoxDecoration(
            color: Colors.white,
          ),
          child: Icon(Icons.arrow_back,)),
    ),
  ),


  elevation: 0.1,

  title: Container(
    margin: EdgeInsets.only(
      left: 16,
    ),
    child: Text(
      "$widget.title",
      style: TextStyle(
          color: AppTheme.black, fontSize: 24, fontWeight: FontWeight.w600),
    ),
  ),



  floating: true,
  pinned: true,
  snap: false,
  stretch: true,
  centerTitle: false,

// here is custom app searcbar
  flexibleSpace: CustomSearchHeader(
    color: [
      AppTheme.white,
      AppTheme.white,
    ],
    context: context,
    width: _width,
    height: _height,
    onChange: (String value) 
      _jobBloc.add(SearchAddress(listData: _listData, query: value));
    ,
  ),
);

【讨论】:

【参考方案2】:

感谢@Mateen, 您的回答让我知道我必须将高度更改传递给搜索小部件。

结果如下。

【讨论】:

快乐是我的,享受扑腾的调情。

以上是关于容器高度监听器的主要内容,如果未能解决你的问题,请参考以下文章

Spring----监听器容器

div元素监听resize的方法

vue监听页面宽度高度

Vue监听页面窗口改变,实现子页面高度数值更新

监听虚拟键盘弹出的高度

js如何监听屏幕滚动到底了