Flutter 实现一个悬浮的效果

在原来的基础布局下修改

修改 DTMessageScreen
  • 使用 Stack 作为容器
  • 且套 SingleChildScrollView ,监听 controller 滚动事件
  • 再 Stack 容器中多添加一个DTMessageTopQuick,使用 Positioned 包裹
  • 通过监听 controller 控制 AnimatedOpacity 透明度显示和隐藏
  1. @override
  2. Widget build(BuildContext context) {
  3. return Scaffold(
  4. backgroundColor: Colors.white,
  5. appBar: buildAppBar(context),
  6. body: Stack(
  7. children: <Widget>[
  8. SingleChildScrollView(
  9. controller: _scrollController,
  10. child: Column(
  11. children: <Widget>[
  12. DTMessageSearchDecoration(),
  13. DTMessageTopQuick(),
  14. DTMessageTopMask(),
  15. DTMessageListView(),
  16. ],
  17. ),
  18. ),
  19. Positioned(
  20. top: 0,
  21. left: 0,
  22. right: 0,
  23. child: AnimatedOpacity(
  24. opacity: topQuickOpacity,
  25. duration: Duration.zero,
  26. child:
  27. Container(color: Colors.white, child: DTMessageTopQuick())),
  28. ),
  29. ],
  30. ),
  31. );
  32. }

添加滚动监听
  1. ScrollController _scrollController;
  2. double topQuickOpacity = 0.0;
  3. @override
  4. void initState() {
  5. _scrollController = ScrollController();
  6. _scrollController
  7. ..addListener(() {
  8. int offset = _scrollController.offset.ceil();
  9. this.setState(() {
  10. topQuickOpacity = offset > kSize70 ? 1.0 : 0.0;
  11. });
  12. });
  13. super.initState();
  14. }