我觉得不用监听滚动去改变背景颜色,应该是有相关参数可以做处理的,但我找不到。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:developer';
class SliverNavBar extends StatefulWidget {
SliverNavBar({Key? key}) : super(key: key);
@override
_SliverNavBarState createState() => _SliverNavBarState();
}
class _SliverNavBarState extends State<SliverNavBar> {
late ScrollController _scrollController;
bool _scrollTop = false;
void _scrollListener () {
// log("scroll" + _scrollController.offset.toString());
if (_scrollController.offset < 10 && _scrollTop) {
setState(() {
_scrollTop = false;
});
} else if (_scrollController.offset > 10 && !_scrollTop) {
setState(() {
_scrollTop = true;
});
}
}
@override
void initState() {
_scrollController = new ScrollController();
_scrollController.addListener(_scrollListener);
super.initState();
}
Widget _buildGird () {
return SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 3 / 2,
),
delegate:
SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.blue[100 * (index % 9)],
child: Text('Grid Item $index'),
);
},
childCount: 20,
),
);
}
@override
Widget build(BuildContext context) {
Color bgColor = Theme.of(context).scaffoldBackgroundColor;
return CupertinoPageScaffold(
backgroundColor: bgColor,
child: CustomScrollView(
controller: _scrollController,
slivers: [
CupertinoSliverNavigationBar(
backgroundColor: _scrollTop ? Color(0xFFF1F1F1) : bgColor,
border: Border.all(width: 0.0, color: _scrollTop ? Color(0xFFcccccc) : bgColor),
leading: Container(),
largeTitle: Text(
'Large Title',
style: TextStyle(
color: Colors.pink
)
),
),
_buildGird(),
],
));
}
}