Skip to content

Instantly share code, notes, and snippets.

@zmtzawqlp
Created August 13, 2021 03:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zmtzawqlp/139af3739d3f171df88ce0219a44f6fd to your computer and use it in GitHub Desktop.
Save zmtzawqlp/139af3739d3f171df88ce0219a44f6fd to your computer and use it in GitHub Desktop.
ensureVisible 演示
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ScrollController _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: CustomScrollView(
controller: _scrollController,
slivers: <Widget>[
SliverToBoxAdapter(
child: Container(
height: 150,
color: Colors.red,
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext b, int index) {
return Container(
height: 50,
alignment: Alignment.center,
child: Text('$index'),
);
},
childCount: 3,
),
),
SliverToBoxAdapter(
child: Builder(
builder: (BuildContext context) {
return RaisedButton(
onPressed: () {
_scrollController.position.ensureVisible(
context.findRenderObject(),
duration: Duration(
seconds: 1,
),
);
},
child: Text('点我跳转顶部'),
);
},
),
),
SliverPersistentHeader(
delegate: MySliverPersistentHeaderDelegate(_scrollController),
pinned: true,
),
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext b, int index) {
return Container(
height: 100,
alignment: Alignment.center,
child: Text('$index'),
);
},
childCount: 100,
),
)
],
),
);
}
}
class MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate {
MySliverPersistentHeaderDelegate(this.scrollController);
final ScrollController scrollController;
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return Builder(
builder: (BuildContext context) {
return RaisedButton(
onPressed: () {
scrollController.position.ensureVisible(
context.findRenderObject(),
duration: Duration(
seconds: 1,
),
);
},
child: Text('点我跳转顶部,我是固定的'),
);
},
);
}
@override
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
return true;
}
@override
double get maxExtent => 48;
@override
double get minExtent => 48;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment