Flutter轮播图插件page_swiper的使用
Flutter轮播图插件 page_swiper
的使用
page_swiper
是一个用于构建多页面滚动UI的Flutter插件,提供了简单的API和充分的自定义选项。它特别适合需要带有标题栏或过渡动画的复杂UI设计。
特性
- 支持创建水平可滚动的
PageView
- 提供持久化的标题栏,并支持每个页面的标题、副标题和操作按钮
- 处理设计和过渡动画,帮助开发者更专注于页面逻辑
示例效果
开始使用
首先,在 pubspec.yaml
文件中添加依赖:
dependencies:
page_swiper: ^latest_version
然后运行以下命令安装包:
flutter pub add page_swiper
使用方法
初始化控制器
在你的根页面组件中初始化 PageController
和多个 ScrollController
,每个页面对应一个 ScrollController
。
class MainPage extends StatefulWidget {
static const pageNum = 2;
const MainPage({
this.initialPage = 1,
this.titleHeight = 250,
this.titleHeightCollapsed = 100,
super.key,
});
final int initialPage;
final double titleHeight;
final double titleHeightCollapsed;
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
late PageController _pageController;
late List<ScrollController> _pageScrollControllers;
@override
void initState() {
_pageController = PageController(initialPage: widget.initialPage);
_pageScrollControllers = [
for (int i = 0; i < MainPage.pageNum; i++) ScrollController()
];
super.initState();
}
@override
void dispose() {
_pageController.dispose();
for (var controller in _pageScrollControllers) {
controller.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageSwiper(
pageNum: 2,
pageController: _pageController,
titleHeight: widget.titleHeight,
titleHeightCollapsed: widget.titleHeightCollapsed,
titleFilterBackground: Colors.white.withAlpha(150),
titleFilterSigma: 50,
blurByPage: false,
titleMaxExtend: 1.3,
titles: [
PageTitle.builder(
title: "All Photos",
subtitle: "All photo page",
actions: [
TextButton(
onPressed: () {},
style: TextButton.styleFrom(tapTargetSize: MaterialTapTargetSize.shrinkWrap),
child: const Text("Select"),
),
],
),
PageTitle.builder(
title: "Albums",
subtitle: "Photo albums",
),
],
pages: [
PageContainer.childBuilder(
child: FirstPage(
controller: _pageScrollControllers[0],
titleHeight: widget.titleHeight,
),
),
PageContainer.childBuilder(
child: SecondPage(
controller: _pageScrollControllers[1],
titleHeight: widget.titleHeight,
),
),
],
pageScrollControllers: _pageScrollControllers,
),
);
}
}
设置标题
标题通过 PageTitle.builder
构建,可以在其中设置标题文本、副标题文本以及操作按钮。
PageTitle.builder(
title: "Page 1",
subtitle: "Page 1 subtitle",
actions: [
TextButton(onPressed: () {}, child: const Text("Push Me")),
],
)
设置页面
页面通过 PageContainerBuilder
构建。每个页面应当是一个继承自 CustomScrollView
的组件,并且需要包含一个 PageTitlePlaceholder
来预留标题栏的空间。
import 'package:flutter/material.dart';
class DemoPage extends StatefulWidget {
const DemoPage({
required this.controller,
required this.titleHeight,
super.key,
});
final ScrollController controller;
final double titleHeight;
@override
State<DemoPage> createState() => _DemoPageState();
}
class _DemoPageState extends State<DemoPage> with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context);
return Stack(
children: [
Positioned.fill(
child: CustomScrollView(
controller: widget.controller,
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
slivers: [
PageTitlePlaceholder(height: widget.titleHeight),
// 其他Sliver组件
],
),
),
],
);
}
}
最后,使用 PageContainer.childBuilder
将页面加入到 PageSwiper
的 pages
列表中:
PageContainer.childBuilder(
child: DemoPage(
controller: _pageScrollControllers[0],
titleHeight: widget.titleHeight,
),
)
更多关于Flutter轮播图插件page_swiper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter轮播图插件page_swiper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用page_swiper
插件来实现轮播图的一个基本示例。page_swiper
是一个流行的Flutter插件,用于创建轮播图效果。
首先,你需要在你的pubspec.yaml
文件中添加page_swiper
依赖:
dependencies:
flutter:
sdk: flutter
page_swiper: ^x.y.z # 请将x.y.z替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中创建一个简单的轮播图。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:page_swiper/page_swiper.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Page Swiper Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<String> imageUrls = [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
'https://example.com/image3.jpg',
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page Swiper Demo'),
),
body: Center(
child: PageSwiper(
itemBuilder: (BuildContext context, int index) {
return Image.network(
imageUrls[index],
fit: BoxFit.cover,
);
},
itemCount: imageUrls.length,
autoPlay: true, // 自动播放
autoPlayInterval: 3000, // 自动播放间隔(毫秒)
loop: true, // 循环播放
pagination: new Pagination(
dotsBuilder: (BuildContext context, int index, bool isActive) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: isActive ? Colors.white : Colors.grey.withOpacity(0.5),
),
width: 10.0,
height: 10.0,
);
},
),
controlButtons: new ControlButtons(
prevButton: Icon(Icons.arrow_back_ios),
nextButton: Icon(Icons.arrow_forward_ios),
),
),
),
);
}
}
代码解释:
-
依赖导入:
- 导入
flutter/material.dart
用于基本的Flutter UI组件。 - 导入
page_swiper/page_swiper.dart
用于轮播图组件。
- 导入
-
主应用:
MyApp
是一个StatelessWidget
,定义了应用的主题和主页。
-
主页:
MyHomePage
是一个StatefulWidget
,它包含一个状态,即图片URL列表。- 在
_MyHomePageState
中,我们定义了build
方法,它返回一个包含PageSwiper
的Scaffold
。
-
PageSwiper:
itemBuilder
:定义了每个页面(或轮播项)的内容。在这里,我们使用Image.network
从网络加载图片。itemCount
:定义了轮播项的数量。autoPlay
:是否自动播放。autoPlayInterval
:自动播放的间隔时间(毫秒)。loop
:是否循环播放。pagination
:定义了分页指示器的样式。在这里,我们使用了简单的圆点指示器。controlButtons
:定义了控制按钮的图标。
你可以根据需要调整这些参数和样式,以实现你想要的轮播图效果。