I have an custom app bar which I created using various widgets. The app bar has a background image and some buttons like follow, about etc.
I used it in the page like this:
Widget build(BuildContext context) {
return Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(180),
child: SafeArea(
child: SingleMerchantAppBar(),
),
),
extendBody: false,
body: SingleChildScrollView(
child: _buildItems(context),
),
floatingActionButton: ChatButton(),
);
}
My custom app bar: SingleMerchantAppBar
. But I need to change the entire app bar when the user scrolls up.
Let's call the second app bar AnotherSingleMerchantAppBar
. This app is pretty similar to the default app bar but with no background image and changes in button colors.
My SingleMerchantAppBar can be found
After scroll app bar:
I tried sliver app bar but it makes the app bar small and only the text remains as from the examples I've seen so far.
CodePudding user response:
You need a ScrollController to listen, when a User is scrolling. For example:
class ChangingAppBar extends StatefulWidget {
ChangingAppBar({Key? key}) : super(key: key);
@override
_ChangingAppBarState createState() => _ChangingAppBarState();
}
class _ChangingAppBarState extends State<ChangingAppBar> {
ScrollController _scrollController = ScrollController();
double _scrollPosition = 0;
_scrollListener() {
setState(() {
_scrollPosition = _scrollController.position.pixels;
});
}
@override
void initState() {
_scrollController.addListener(_scrollListener);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _scrollPosition == 0
? AppBar(
title: const Text('1st AppBar'),
backgroundColor: Colors.red,
)
: AppBar(
title: const Text('2nd AppBar'),
backgroundColor: Colors.blue,
),
body: ListView.builder(
controller: _scrollController,
itemCount: 20,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item: $index'),
);
},
),
);
}
}