yu_file_preview 0.1.1
yu_file_preview: ^0.1.1 copied to clipboard
Full-screen media preview for Flutter. Integrates yuni_photo_view, yu_ni_image_widget, and yu_ni_player. Supports image, video, multi-platform UI.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:yu_file_preview/yu_file_preview.dart';
import 'package:yu_ni_player_base/yu_ni_player_base.dart';
import 'package:yu_ni_player_video_player_kit/yu_ni_player_video_player_kit.dart';
import 'pages/api_challenge_page.dart';
import 'pages/custom_chrome_page.dart';
import 'pages/custom_menu_page.dart';
import 'pages/custom_renderer_page.dart';
import 'pages/image_preview_page.dart';
import 'pages/main_preview_page.dart';
import 'pages/paging_preview_page.dart';
import 'pages/video_preview_page.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 media_kit 视频引擎(必须在 runApp 之前)
VideoPlayerKitEngine.initLicense();
// 配置 FilePreview:注册 Android 平台引擎 + DefaultCacheManager 演示图片缓存
FilePreview.configure(
FilePreviewConfig(
imageStorage: DefaultCacheManager(),
playerConfig: YuNiPlayerConfig(
platformEngines: {
PlatformKey.android: (source) => VideoPlayerKitEngine(source),
PlatformKey.defaultKey: (source) => VideoPlayerKitEngine(source),
},
),
),
);
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'yu_file_preview 示例',
theme: ThemeData.dark(),
home: const HomePage(),
routes: {
'/main-preview': (_) => const MainPreviewPage(),
'/image': (_) => const ImagePreviewPage(),
'/video': (_) => const VideoPreviewPage(),
'/custom-renderer': (_) => const CustomRendererPage(),
'/custom-menu': (_) => const CustomMenuPage(),
'/custom-chrome': (_) => const CustomChromePage(),
'/api-challenge': (_) => const ApiChallengePage(),
'/paging': (_) => const PagingPreviewPage(),
},
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
static const _demos = [
_Demo('完整预览(对齐主项目)', '图片/视频/其他文件,含日期顶部栏、原图按钮、Live Photo、信息面板', '/main-preview'),
_Demo('图片预览', '含 Hero 动画、查看原图、Live Photo 角标、信息面板', '/image'),
_Demo('视频预览', '含封面、播放控制、翻页自动暂停、信息面板', '/video'),
_Demo('自定义渲染器', '注册 PDF 占位页示例', '/custom-renderer'),
_Demo('自定义菜单', '注入「设为封面」「复制到相册」', '/custom-menu'),
_Demo('自定义 Chrome', '自定义顶部栏、底部栏、全局水印浮层', '/custom-chrome'),
_Demo('API 实战挑战', '测试 show/showPaging、参数重写、分页加载逻辑', '/api-challenge'),
_Demo('分页加载测试', '测试异步分页加载及预加载阈值设置', '/paging'),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('yu_file_preview 示例')),
body: ListView.separated(
padding: const EdgeInsets.all(16),
itemCount: _demos.length,
separatorBuilder: (_, __) => const Divider(),
itemBuilder: (ctx, i) {
final demo = _demos[i];
return ListTile(
title: Text(demo.title),
subtitle: Text(demo.subtitle),
trailing: const Icon(Icons.chevron_right),
onTap: () => Navigator.pushNamed(ctx, demo.route),
);
},
),
);
}
}
class _Demo {
const _Demo(this.title, this.subtitle, this.route);
final String title;
final String subtitle;
final String route;
}