【问题标题】:How to get shuch effect of AppBar title in Flutter?如何在 Flutter 中获得 AppBar 标题的 shuch 效果?
【发布时间】:2020-02-28 13:36:03
【问题描述】:

我怎样才能得到这样的AppBar标题效果,示例:

大标题“咖啡店”在页面滚动时消失并出现在appBar中。谢谢。

【问题讨论】:

    标签: flutter flutter-layout flutter-animation


    【解决方案1】:

    可能你需要SliverAppBar

    • 也可以查看this教程

    基于文章的示例:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'App',
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: MainCollapsingToolbar());
      }
    }
    
    class MainCollapsingToolbar extends StatefulWidget {
      @override
      _MainCollapsingToolbarState createState() => _MainCollapsingToolbarState();
    }
    
    class _MainCollapsingToolbarState extends State<MainCollapsingToolbar> {
      ScrollController _scrollController = ScrollController();
      double offset = 0.0;
      @override
      void initState() {
        super.initState();
        _scrollController.addListener(() {
          setState(() {
            offset = _scrollController.offset;
          });
        });
      }
    
      @override
      void dispose() {
        _scrollController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: DefaultTabController(
            length: 2,
            child: NestedScrollView(
              controller: _scrollController,
              headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
                return <Widget>[
                  SliverAppBar(
                    expandedHeight: 200.0,
                    floating: false,
                    pinned: true,
                    flexibleSpace: FlexibleSpaceBar(
                      centerTitle: (offset == 0) ? false : true,
                      title: Text("Collapsing Toolbar",
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 16.0,
                          )),
                    ),
                  ),
                  SliverPersistentHeader(
                    delegate: _SliverAppBarDelegate(
                      TabBar(
                        labelColor: Colors.black87,
                        unselectedLabelColor: Colors.grey,
                        tabs: [
                          Tab(icon: Icon(Icons.info), text: "Tab 1"),
                          Tab(icon: Icon(Icons.lightbulb_outline), text: "Tab 2"),
                        ],
                      ),
                    ),
                    pinned: true,
                  ),
                ];
              },
              body: Center(
                child: Text("Sample text"),
              ),
            ),
          ),
        );
      }
    }
    
    class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
      _SliverAppBarDelegate(this._tabBar);
    
      final TabBar _tabBar;
    
      @override
      double get minExtent => _tabBar.preferredSize.height;
      @override
      double get maxExtent => _tabBar.preferredSize.height;
    
      @override
      Widget build(
          BuildContext context, double shrinkOffset, bool overlapsContent) {
        return new Container(
          child: _tabBar,
        );
      }
    
      @override
      bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
        return false;
      }
    }
    

    【讨论】:

    • 我测试了很多使用条子的例子,但没有找到合适的。我需要得到与示例中完全相同的效果。
    • 问题在于放置一个大标题。可以选择将条子与 FlexibleSpaceBar 一起使用,但我收到此处描述的“错误”:github.com/flutter/flutter/issues/23864
    • 我认为您不会找到完全相同的示例。您必须进行一些实验才能弄清楚如何解决它。我使用基于 Medium 文章的示例更新了答案。希望它会有所帮助
    • 使用 ScrollController 并检查滚动状态是一种解决方案。谢谢!
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2020-01-22
    • 2019-09-09
    • 1970-01-01
    • 2019-01-23
    • 2018-10-09
    • 2019-06-04
    • 2020-01-16
    相关资源
    最近更新 更多