在Flutter中更改滚动方向时,SABT小部件的行为不一致

avkwfej4  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(98)

如果我向下滚动,折叠的应用程序栏变得可见,第一个子项也可见。那很好啊。但是,如果我突然将滚动方向更改为向上,即使应用程序栏仍然折叠,也会显示第二个子项。为什么会发生这种情况?代码的哪一部分可能导致问题?
产品编号:

class SABT extends StatefulWidget {
  final Widget firstChild;
  final Widget secondChild;

  const SABT({
    Key? key,
    required this.firstChild,
    required this.secondChild,
  }) : super(key: key);

  @override
  _SABTState createState() => _SABTState();
}

class _SABTState extends State<SABT> {
  ScrollPosition? _position;
  bool _visibleFirst = true;

  @override
  void dispose() {
    _removeListener();
    super.dispose();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    _removeListener();
    _addListener();
  }

  void _addListener() {
    _position = Scrollable.of(context)?.position;
    _position?.addListener(_positionListener);
    _positionListener();
  }

  void _removeListener() {
    _position?.removeListener(_positionListener);
  }

  void _positionListener() {
    final FlexibleSpaceBarSettings? settings =
        context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>();

    bool visibleFirst =
        settings == null || settings.currentExtent <= settings.minExtent;

    if (_visibleFirst != visibleFirst) {
      setState(() {
        _visibleFirst = visibleFirst;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Visibility(
      visible: _visibleFirst,
      child: widget.firstChild,
      replacement: Visibility(
        visible: !_visibleFirst,
        child: widget.secondChild,
      ),
    );
  }
}
SliverAppBar(
           pinned: true,
           elevation: 0,
           stretch: true,
            expandedHeight: 500,
title: SABT(firstChild: Text("first title"),secondChild: Text("second title")),
            flexibleSpace: FlexibleSpaceBar(
              background: Container(
                color: Colors.purple,
              ),
            ),
          ),

我已经检查了SABT小部件的代码,并在Flutter项目中进行了测试。为了解决这个问题,我检查了滚动位置侦听器和可见性逻辑。此外,我还回顾了包含SABT小部件的SliverAppBar的实现。然而,尽管我努力,我不能确定问题的确切原因。
我期望SABT小部件在滚动方向突然变为向上时保持第一个子项的可见性,即使SliverAppBar保持折叠状态。但是,当前,当我将滚动方向更改为向上时,意外地显示了第二个子项。我希望SABT小部件在滚动方向改变时始终显示第一个子项,只要SliverAppBar仍然折叠。

ma8fv8wu

ma8fv8wu1#

在替换中,您不必再次添加可见性

replacement:  widget.secondChild,

隐藏第一个子项时显示替换

相关问题