Reputation: 365
I want to switch to a another Screen, when i tap to the other icon on the tab bar but it does not work. I am always in HomeScreen() and I can´t switch to the HomeScreenMapView(). I think i have an issue at the return by the ListView.builder
but i don´t know how i continue.
My Code:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import '../screens/home_screen.dart';
import '../screens/home_screen_map_view.dart';
class TabBarTop extends StatefulWidget {
@override
_TabBarTopState createState() => _TabBarTopState();
}
class _TabBarTopState extends State<TabBarTop> with SingleTickerProviderStateMixin {
bool _isAppbar = true;
ScrollController _scrollController = new ScrollController();
@override
void initState() {
super.initState();
_scrollController.addListener(() {
if (_scrollController.position.userScrollDirection ==
ScrollDirection.reverse) {
appBarStatus(false);
}
if (_scrollController.position.userScrollDirection ==
ScrollDirection.forward) {
appBarStatus(true);
}
});
}
void appBarStatus(bool status) {
setState(() {
_isAppbar = status;
});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(MediaQuery.of(context).size.height * 0.12),
child: AnimatedContainer(
height: _isAppbar ? MediaQuery.of(context).size.height * 1 : 0.0,
duration: Duration(milliseconds: 200),
child: CustomAppBar(),
),
),
body: ListView.builder(
controller: _scrollController,
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return HomeScreen();
},
),
),
);
}
}
class CustomAppBar extends StatefulWidget {
@override
AppBarView createState() => new AppBarView();
}
class AppBarView extends State<CustomAppBar> {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, value) {
return [
SliverAppBar(
title: Center(
heightFactor: 0,
child: Padding(
padding: const EdgeInsets.only(top: 7),
child: Image.asset(
'assets/images/***.png',
fit: BoxFit.cover,
scale: MediaQuery.of(context).size.width * 0.007,
alignment: Alignment.bottomCenter,
),
),
),
expandedHeight: MediaQuery.of(context).size.height * 0.12,
primary: true,
floating: true,
pinned: true,
bottom: TabBar(
indicatorColor: Color.fromRGBO(253, 166, 41, 1.0),
tabs: <Widget>[
Tab(
icon: Icon(Icons.list),
),
Tab(
icon: Icon(Icons.location_on),
),
],
),
forceElevated: false,
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: <Color>[
Color.fromRGBO(107, 176, 62, 1.0),
Color.fromRGBO(153, 199, 58, 1.0),
],
),
),
),
)
];
},
body: TabBarView(
children: <Widget>[
HomeScreen(),
HomeScreenMapView(),
],
),
),
);
}
}
Thanks :)
Upvotes: 0
Views: 2039
Reputation: 27147
I think you don't need TabBarTop class to achieve so, you can only go with CustomAppBar class which provide that facility.
I don't know how much i currently understand your question and need but i am answering it.
Hope following code help you.
Directly call TabBarTop from your main.
class TabBarTop extends StatefulWidget {
@override
_TabBarTopState createState() => _TabBarTopState();
}
class _TabBarTopState extends State<TabBarTop>
with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder:
(BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
expandedHeight: 50.0,
floating: true,
snap: true,
flexibleSpace: FlexibleSpaceBar(
centerTitle: true,
title: Text("Collapsing Toolbar",
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
)),
background: Image.network(
"https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&h=350",
fit: BoxFit.cover,
)),
),
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: TabBarView(
children: <Widget>[
HomeScreen(),
Container(
child: Center(child: Text("cds2")),
),
],
),
),
),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: ListView.builder(
itemExtent: 150,
itemCount: 10,
itemBuilder: (_, index) {
return Text("csca $index");
},
),
);
}
}
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(
color: Colors.white,
child: _tabBar,
);
}
@override
bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
return false;
}
}
Upvotes: 1