钉钉标记项滚动吸附效果
思路: 使用 Stack 布局,一开始把 DTMessageTopQuick 组件加入到容器中,监听滚动,来改变 opacity 值显示出 DTMessageTopQuick
- 修改
DTMessageScreen
extendsStatefulWidget
class DTMessageScreen extends StatefulWidget {}
- 使用 Stack 布局 + Positioned实现,修改 build 方法
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: buildAppBar(context),
body: Stack(
children: <Widget>[
SingleChildScrollView(
controller: _scrollController,
child: Column(
children: <Widget>[
DTMessageSearchDecoration(),
DTMessageTopQuick(),
DTMessageTopMask(),
DTMessageListView(),
],
),
),
Positioned(
top: 0,
left: 0,
right: 0,
child: AnimatedOpacity(
opacity: topQuickOpacity,
duration: Duration.zero,
child:
Container(color: Colors.white, child: DTMessageTopQuick())),
),
],
),
);
}
监听 SingleChildScrollView 滚动,改变 Positioned 的 opacity 值
ScrollController _scrollController;
double topQuickOpacity = 0.0;
@override
void initState() {
_scrollController = ScrollController();
_scrollController
..addListener(() {
int offset = _scrollController.offset.ceil();
this.setState(() {
topQuickOpacity = offset > kSize70 ? 1.0 : 0.0;
});
});
super.initState();
}
这样方法只是实现的一种,还可以使用其他方法实现(其他方法暂时没有想到,TODO:)