如果我向下滚动,折叠的应用程序栏变得可见,第一个子项也可见。那很好啊。但是,如果我突然将滚动方向更改为向上,即使应用程序栏仍然折叠,也会显示第二个子项。为什么会发生这种情况?代码的哪一部分可能导致问题?
产品编号:
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仍然折叠。
1条答案
按热度按时间ma8fv8wu1#
在替换中,您不必再次添加可见性
隐藏第一个子项时显示替换