Flutter NestedScrollView示例
flutter 示例
2023-09-27 14:27:34 时间
嵌套SliverAppBar
class NestedScrollViewComponent extends StatefulWidget {
const NestedScrollViewComponent({Key? key, required this.title})
: super(key: key);
final String title;
@override
State<NestedScrollViewComponent> createState() {
return NestedScrollViewState();
}
}
class NestedScrollViewState extends State<NestedScrollViewComponent> {
@override
Widget build(BuildContext context) {
return Material(
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: const Text("嵌套ListView"),
pinned: true,
//固定在顶部
forceElevated: innerBoxIsScrolled,
floating: true,
snap: true,
expandedHeight: 240,
flexibleSpace: FlexibleSpaceBar(
background: Image.asset("images/avatar.png", fit: BoxFit.cover),
),
),
//构建一个 sliverList
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text('List $index'),
);
},
childCount: 5,
),
),
];
},
body: ListView.builder(
padding: const EdgeInsets.all(10),
physics: const ClampingScrollPhysics(),
itemCount: 30,
itemBuilder: (context, index) {
return SizedBox(
height: 40,
child: Center(child: Text("Item $index")),
);
},
),
),
);
}
buildSliverList(int i) {
ListView.builder(
padding: const EdgeInsets.all(10),
physics: const ClampingScrollPhysics(),
itemCount: i,
itemBuilder: (context, index) {
return SizedBox(
height: 40,
child: Center(child: Text("$index")),
);
},
);
}
}
或
class NestedScrollViewComponent extends StatefulWidget {
const NestedScrollViewComponent({Key? key, required this.title})
: super(key: key);
final String title;
@override
State<NestedScrollViewComponent> createState() {
return NestedScrollViewState();
}
}
class NestedScrollViewState extends State<NestedScrollViewComponent> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
// 实现 snap 效果
SliverAppBar(
floating: true,
snap: true,
expandedHeight: 200,
forceElevated: innerBoxIsScrolled,
flexibleSpace: FlexibleSpaceBar(
background: Image.asset(
"images/avatar.png",
fit: BoxFit.cover,
),
),
),
];
},
body: Builder(builder: (BuildContext context) {
return CustomScrollView(
slivers: <Widget>[buildSliverList(100)],
);
}),
),
);
}
buildSliverList(int i) {
return SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text('List $index'),
);
},
childCount: i,
),
);
}
}
嵌套 TabBarView
class NestedScrollViewComponent extends StatefulWidget {
const NestedScrollViewComponent({Key? key, required this.title})
: super(key: key);
final String title;
@override
State<NestedScrollViewComponent> createState() {
return NestedScrollViewState();
}
}
class NestedScrollViewState extends State<NestedScrollViewComponent> {
@override
Widget build(BuildContext context) {
final _tabs = <String>['猜你喜欢', '今日特价', '发现更多'];
// 构建 tabBar
return DefaultTabController(
length: _tabs.length, // This is the number of tabs.
child: Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(
title: const Text('商城'),
floating: true,
snap: true,
forceElevated: innerBoxIsScrolled,
bottom: TabBar(
tabs: _tabs.map((String name) => Tab(text: name)).toList(),
),
),
),
];
},
body: TabBarView(
children: _tabs.map((String name) {
return Builder(
builder: (BuildContext context) {
return CustomScrollView(
key: PageStorageKey<String>(name),
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverPadding(
padding: const EdgeInsets.all(8.0),
sliver: buildSliverList(50),
),
],
);
},
);
}).toList(),
),
),
),
);
}
buildSliverList(int i) {
return SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text('List $index'),
);
},
childCount: i,
),
);
}
}
效果
相关文章
- flutter widget---->FloatingActionButton
- Flutter Web 开发实践与优化
- Flutter 新一代图形渲染器 Impeller
- Flutter 应用调试
- 闲鱼又一企业级巨著《Flutter in action》开放下载
- 源码解读Flutter tools机制
- Flutter 的setState与FutureBuilder及EasyRefresh示例
- Flutter入门:Text问题集锦
- 适合编程初学者的开源博客系统(Flutter版)
- Flutter WillPopScope示例
- Flutter CustomScrollView和Slivers示例
- Flutter PageView示例
- Flutter SingleChildScrollView的示例
- Flutter容器组件示例
- Flutter TextField示例
- Flutter WebView示例
- Flutter 过渡动画组件 示例
- Flutter 字体设置加粗
- Flutter 悬浮控件
- flutter通过 GlobalKey 获取界面任意元素坐标尺寸
- Flutter仿微信,支付宝密码输入框+自定义键盘
- Flutter状态管理Provider
- Flutter组件通信