【问题标题】:flutter fix tabbar in top of screen when i scroll the view当我滚动视图时,颤动修复屏幕顶部的标签栏
【发布时间】:2020-03-25 19:25:19
【问题描述】:

就像个人资料页面中的Instagram一样,当我滚动视图时,我想在屏幕顶部修复Tabbar,例如:

我想我应该用SliverAppBar 来实现它,这是我的代码,但它不能正常工作,并且在选项卡元素的顶部会改变高度

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  TabController _tabController;
  ScrollController _scrollViewController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: 2);
    _scrollViewController = ScrollController(initialScrollOffset: 0.0);
  }

  @override
  void dispose() {
    _tabController.dispose();
    _scrollViewController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: NestedScrollView(
        controller: _scrollViewController,
        headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {
          return <Widget>[
            SliverAppBar(
              title: Column(
                children: <Widget>[
                  Container(
                    height: 200.0,
                    color: Colors.green,
                  ),
                  Container(
                    height: 200.0,
                    color: Colors.yellow,
                  ),

                ],
              ),
              pinned: true,
              floating: true,
              forceElevated: boxIsScrolled,
              bottom: TabBar(
                tabs: <Widget>[
                  Tab(
                    text: "Home",
                    icon: Icon(Icons.home),
                  ),
                  Tab(
                    text: "Example page",
                    icon: Icon(Icons.help),
                  )
                ],
                controller: _tabController,
              ),
            )
          ];
        },
        body: TabBarView(
          children: <Widget>[
            PageOne(),
            PageTwo(),
          ],
          controller: _tabController,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.control_point),
        onPressed: () {
          _tabController.animateTo(1,
              curve: Curves.bounceInOut, duration: Duration(milliseconds: 10));

          // _scrollViewController.animateTo(
          //     _scrollViewController.position.minScrollExtent,
          //     duration: Duration(milliseconds: 1000),
          //     curve: Curves.decelerate);

          _scrollViewController
              .jumpTo(_scrollViewController.position.maxScrollExtent);
        },
      ),
    );
  }
}

class PageOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Image.asset(
            'assets/photos/wallpaper-1.jpg',
            width: 200.0,
          ),
          Image.asset(
            'assets/photos/wallpaper-2.jpg',
            width: 200.0,
          ),
          Image.asset(
            'assets/photos/wallpaper-3.jpg',
            width: 200.0,
          ),
        ],
      ),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemExtent: 250.0,
      itemBuilder: (context, index) => Container(
        padding: EdgeInsets.all(10.0),
        child: Material(
          elevation: 4.0,
          borderRadius: BorderRadius.circular(5.0),
          color: index % 2 == 0 ? Colors.cyan : Colors.deepOrange,
          child: Center(
            child: Text(index.toString()),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    这对你有用吗?

    import 'package:flutter/material.dart';
    
    class Popo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.grey[100],
          body: SafeArea(
            child: CustomScrollView(
              slivers: <Widget>[
                SliverAppBar(
                  backgroundColor: Colors.grey[100],
                  title: Container(
                    color: Colors.grey[100],
                    height: 200,
                    width: MediaQuery.of(context).size.width,
                    child: Center(
                      child: Text(
                        "Head",
                        style: TextStyle(
                          color: Colors.black
                        ),
                      ),
                    ),
                  ),
                ),
                SliverAppBar(
                  pinned: true,
                  backgroundColor: Colors.white,
                  title: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    mainAxisSize: MainAxisSize.max,
                    children: <Widget>[
                      Icon(
                        Icons.dashboard
                      ),
                      Icon(
                          Icons.tv
                      ),
                      Icon(
                          Icons.person
                      ),
                    ],
                  ),
                ),
                SliverAnimatedList(
                  itemBuilder: (_, index, ___){
                    return ListTile(
                      title: Text(index.toString()),
                    );
                  },
                  initialItemCount: 100,
                )
              ],
            ),
          ),
        );
      }
    }
    

    输出:

    【讨论】:

    • @Josteve Adekanbi 非常感谢,如何自定义SliverAppBar?和 instagram 一样,我在这里有更多 Column
    • 你能如你所愿吗?我必须像 Instagram 一样做标签栏。 @DolDurma
    • @AlperenARICI 是的,你可以测试这个样本,它也很有效
    • 是的,谢谢,这行得通,但我不完全那样,就像在 instagram 中那样,下面的菜单会左右移动。我想。 @DolDurma
    • @AlperenARICI 你的意思是底部导航菜单?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2012-02-15
    相关资源
    最近更新 更多