Reputation: 154
I'm trying to achieve the behavior as we see in android WhatsApp and advised tab behavior in material design, check suggestion here and the video here. When i scroll down, I want the tab bar to be visible but the app bar to hide, this behaviour can be seen on the medium android app as well.
I saw there was an earlier answer here, but it did not work for me.
I've tried several approaches but the nested scroll view doesn't work for me.
return DefaultTabController(
length: 2,
child:Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text("Application"),
floating: true,
pinned: true,
snap: true,
bottom: TabBar(
tabs: <Tab>[
Tab(text: "T"),
Tab(text: "B"),
], // <-- total of 2 tabs
),
),
];
},
body: TabBarView(
children: <Widget>[
RandomWords(),
RandomWords(),
],
),
),
),
);
and tried this as well,
Scaffold(
body: NestedScrollView(
controller: _scrollViewController,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text("N"),
pinned: true,
floating: true,
forceElevated: innerBoxIsScrolled,
//snap: true,
bottom: TabBar(
tabs: <Tab>[
Tab(text: "T"),
Tab(text: "B"),
],
controller: _tabController,
),
)
];
},
body: TabBarView(
children: <Widget>[
RandomWords(),
RandomWords(),
],
controller: _tabController,
),
),
),
);
My code is available here.
Is there any reason the NestedScrollView
might not work?
Upvotes: 1
Views: 661
Reputation: 34270
Try This
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: new Scaffold(
body: new NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
new SliverAppBar(
title: Text("Application"),
floating: true,
pinned: true,
snap: true,
bottom: new TabBar(
tabs: <Tab>[
new Tab(text: "T"),
new Tab(text: "B"),
], // <-- total of 2 tabs
),
),
];
},
body: new TabBarView(
children: <Widget>[
Center(
child: Text(
'T Tab',
style: TextStyle(fontSize: 30),
)),
Center(
child: Text(
'B Tab',
style: TextStyle(fontSize: 30),
)),
],
),
),
),
);
}
}
Output:
Upvotes: 1