吸顶是常见的布局,主要使用的是CustomScrollView 和SliverApp组件实现的
- @override
- Widget build(BuildContext context) {
- return CustomScrollView(
- controller: controller.scrollController!,
- physics: const BouncingScrollPhysics(),
- slivers: [
- SliverAppBar(
- backgroundColor: Colors.blue,
- iconTheme: const IconThemeData(color: Colors.white),
- expandedHeight: controller.kExpandedHeight,
- floating: false,
- pinned: true,
- stretch: false,
- snap: false,
- stretchTriggerOffset: ScreenHelper.height(100),
- onStretchTrigger: () async {
- return;
- },
- flexibleSpace: FlexibleSpaceBar(
- centerTitle: true,
- title: Obx(() => Text(
- controller.isAppBArPinned.value ? "体重检测" : "",
- style: TextStyle(
- color: Colors.white, fontSize: ScreenHelper.sp(16)),
- )),
- collapseMode: CollapseMode.parallax,
- stretchModes: [
- StretchMode.zoomBackground,
- StretchMode.fadeTitle,
- StretchMode.blurBackground,
- ],
- background: Container(
- color: Colors.blue,
- child: Column(
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- SizedBox(height: ScreenHelper.topSafeHeight + 18),
- Text(
- "2021年12月30日 13:00",
- style: TextStyle(color: Colors.white.withOpacity(.8)),
- ),
- SizedBox(height: ScreenHelper.height(30)),
- Row(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- Text(
- "52.0",
- style: TextStyle(
- color: Colors.white,
- fontSize: ScreenHelper.sp(40),
- fontWeight: FontWeight.bold),
- ),
- Text(
- "kg",
- style: TextStyle(
- color: Colors.white, fontSize: ScreenHelper.sp(13)),
- )
- ],
- ),
- SizedBox(
- height: ScreenHelper.height(5),
- ),
- Text(
- "BMI 20.7 标准",
- style: TextStyle(
- color: Colors.white.withOpacity(.8),
- fontSize: ScreenHelper.sp(14)),
- ),
- SizedBox(
- height: ScreenHelper.height(15),
- ),
- Container(
- padding: EdgeInsets.symmetric(horizontal: 6, vertical: 4),
- decoration: BoxDecoration(
- color: Colors.yellow,
- borderRadius: BorderRadius.circular(50)),
- child: Text(
- "记录体重",
- style: TextStyle(
- color: Colors.white, fontSize: ScreenHelper.sp(14)),
- ),
- )
- ],
- ),
- ),
- ),
- ),
- SliverFixedExtentList(
- delegate: SliverChildBuilderDelegate(
- (context, index) => ListTile(
- title: Text(
- "测试",
- style: TextStyle(color: AppTheme.dartTextColor),
- ),
- ),
- childCount: 30),
- itemExtent: 50.0,
- ),
- ],
- );
- }
因为使用的getx状态管理,所以数据的操作都在getx里
- ScrollController? scrollController;
- final isAppBArPinned = false.obs; //判断APPbar是否吸顶
- double kExpandedHeight = ScreenHelper.width(240);
-
- void onInit() {
- // TODO: implement onInit
- scrollController = ScrollController()..addListener(_onScroll);
-
- super.onInit();
- }
-
-
- void _onScroll() {
-
- if (scrollController!.hasClients &&
- scrollController!.offset > kExpandedHeight - kToolbarHeight) {
- isAppBArPinned.value = true;
- } else {
- isAppBArPinned.value = false;
- }
- }
-
- @override
- void onClose() {
- // TODO: implement onClose
- super.onClose();
- scrollController!.dispose();
- }
最后呈现的效果
吸顶