Flutter故事讲述插件story_time的使用
Flutter故事讲述插件story_time的使用
story_time 插件简介
story_time
是一个 Instagram 故事样式的 UI 插件,具有丰富的动画效果和高度的自定义性。它基于 story
包进行了改进,提供了更多的功能和灵活性。
- pub.dev 上的版本:
- 许可证:MIT License
使用方法
基本用法
StoryPageView
需要至少三个参数:itemBuilder
、pageLength
和 storyLength
。
return Scaffold(
body: StoryPageView(
itemBuilder: (context, pageIndex, storyIndex) {
return Center(
child: Text("Index of PageView: $pageIndex Index of story on each page: $storyIndex"),
);
},
storyLength: (pageIndex) {
return 3;
},
pageLength: 4,
),
);
itemBuilder
:用于构建故事内容,接收两个索引参数(页面索引和故事索引)。storyLength
:决定每个页面的故事数量。pageLength
:StoryPageView
的总页数。
实际应用示例
以下是一个更实际的应用示例,从 example 中提取:
return Scaffold(
body: StoryPageView(
itemBuilder: (context, pageIndex, storyIndex) {
final user = sampleUsers[pageIndex];
final story = user.stories[storyIndex];
return Stack(
children: [
Positioned.fill(
child: Container(color: Colors.black),
),
Positioned.fill(
child: Image.network(
story.imageUrl,
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.only(top: 44, left: 8),
child: Row(
children: [
Container(
height: 32,
width: 32,
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(user.imageUrl),
fit: BoxFit.cover,
),
shape: BoxShape.circle,
),
),
const SizedBox(
width: 8,
),
Text(
user.userName,
style: TextStyle(
fontSize: 17,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
);
},
gestureItemBuilder: (context, pageIndex, storyIndex) {
return Align(
alignment: Alignment.topRight,
child: Padding(
padding: const EdgeInsets.only(top: 32),
child: IconButton(
padding: EdgeInsets.zero,
color: Colors.white,
icon: Icon(Icons.close),
onPressed: () {
Navigator.pop(context);
},
),
),
);
},
pageLength: sampleUsers.length,
storyLength: (int pageIndex) {
return sampleUsers[pageIndex].stories.length;
},
onPageLimitReached: () {
Navigator.pop(context);
},
),
);
数据模型
推荐使用两层数据模型,例如 UserModel
包含 StoryModel
列表:
class UserModel {
UserModel(this.stories, this.userName, this.imageUrl);
final List<StoryModel> stories;
final String userName;
final String imageUrl;
}
class StoryModel {
StoryModel(this.imageUrl);
final String imageUrl;
}
控制动画
story_time
支持控制特定索引故事的持续时间。可以通过 IndicatorAnimationCommand
来实现:
late ValueNotifier<IndicatorAnimationCommand> indicatorAnimationController;
@override
void initState() {
super.initState();
indicatorAnimationController = ValueNotifier<IndicatorAnimationCommand>(
IndicatorAnimationCommand(resume: true),
);
}
@override
void dispose() {
indicatorAnimationController.dispose();
super.dispose();
}
// 在 StoryPageView 中使用
indicatorAnimationController: indicatorAnimationController,
onStoryIndexChanged: (int newStoryIndex) {
if (newStoryIndex == 1) {
indicatorAnimationController.value = IndicatorAnimationCommand(
duration: const Duration(seconds: 20),
);
} else {
indicatorAnimationController.value = IndicatorAnimationCommand(
duration: const Duration(seconds: 5),
);
}
},
回调函数
暂停和恢复故事
支持添加暂停和恢复故事的回调:
onStoryPaused: () {
print("Story is paused!!");
},
onStoryUnpaused: () {
print("Story is unpaused!!");
},
页面切换
支持前后翻页的回调:
onPageBack: (int newPageIndex) {
int oldPage = newPageIndex + 1;
print("from oldPage:$oldPage to newPage:$newPageIndex");
},
onPageForward: (int newPageIndex) {
int oldPage = newPageIndex - 1;
print("from oldPage:$oldPage to newPage:$newPageIndex");
},
故事切换
支持故事索引变化的回调:
onStoryIndexChanged: (int newStoryIndex) {
print('newStoryInd: $newStoryIndex');
},
提示
此插件仍在开发中,如果有任何请求或问题,请在 GitHub 上提出。
希望这些信息能帮助你更好地理解和使用 story_time
插件!如果你有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter故事讲述插件story_time的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter故事讲述插件story_time的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用story_time
插件的简单示例代码。这个插件通常用于在应用中展示故事,可以包含文本、图片、音频等多媒体内容。假设你已经通过pubspec.yaml
文件添加了story_time
依赖并运行了flutter pub get
来安装它。
1. 添加依赖
首先,确保在你的pubspec.yaml
文件中添加story_time
依赖:
dependencies:
flutter:
sdk: flutter
story_time: ^最新版本号 # 替换为实际发布的最新版本号
2. 导入插件
在你的Dart文件中导入story_time
插件:
import 'package:story_time/story_time.dart';
3. 配置故事数据
创建一个包含故事内容的列表。这里我们假设每个故事页面包含文本和图片:
List<StoryPage> createStoryPages() {
return [
StoryPage(
text: "这是第一页的故事内容。",
imageUrl: "https://example.com/image1.jpg",
),
StoryPage(
text: "这是第二页的故事内容。",
imageUrl: "https://example.com/image2.jpg",
),
// 可以继续添加更多页面
];
}
4. 使用StoryTimeWidget展示故事
在你的主页面或需要展示故事的页面中,使用StoryTimeWidget
来展示故事:
import 'package:flutter/material.dart';
import 'package:story_time/story_time.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StoryScreen(),
);
}
}
class StoryScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final List<StoryPage> storyPages = createStoryPages();
return Scaffold(
appBar: AppBar(
title: Text("故事时间"),
),
body: StoryTimeWidget(
storyPages: storyPages,
onCompleted: () {
// 当故事完成时执行的回调
print("故事已完成!");
},
// 可选参数:设置翻页动画、文本样式等
pageFlipAnimation: PageFlipAnimation.Curl,
textStyle: TextStyle(fontSize: 20, color: Colors.black),
),
);
}
}
5. 运行应用
确保你的开发环境已经正确设置,然后运行应用:
flutter run
这个示例展示了如何使用story_time
插件来创建一个简单的故事展示应用。你可以根据实际需要调整故事页面的内容,例如添加音频、视频或其他交互元素。详细的功能和自定义选项请参考story_time
插件的官方文档。