60 lines
1.6 KiB
Dart
60 lines
1.6 KiB
Dart
import 'dart:io';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:webview_flutter/webview_flutter.dart';
|
||
|
||
class AttachmentWebViewer extends StatefulWidget {
|
||
final String fileUrl; // 文件的网络地址
|
||
final String fileName; // 显示在 AppBar 上的名称(可选)
|
||
|
||
const AttachmentWebViewer({
|
||
super.key,
|
||
required this.fileUrl,
|
||
this.fileName = '附件预览',
|
||
});
|
||
|
||
@override
|
||
State<AttachmentWebViewer> createState() => _AttachmentWebViewerState();
|
||
}
|
||
|
||
class _AttachmentWebViewerState extends State<AttachmentWebViewer> {
|
||
late final WebViewController _controller;
|
||
bool _isLoading = true;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
|
||
// 初始化 WebView 控制器
|
||
_controller = WebViewController()
|
||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||
..setNavigationDelegate(NavigationDelegate(
|
||
onPageFinished: (_) => setState(() => _isLoading = false),
|
||
))
|
||
..loadRequest(Uri.parse(_buildPreviewUrl(widget.fileUrl)));
|
||
}
|
||
|
||
/// 构造预览链接(pdf 直接打开,其它用 Google Docs)
|
||
String _buildPreviewUrl(String url) {
|
||
final lower = url.toLowerCase();
|
||
if (lower.endsWith('.pdf')) {
|
||
return url;
|
||
} else {
|
||
return 'https://docs.google.com/gview?embedded=true&url=$url';
|
||
}
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: AppBar(title: Text(widget.fileName)),
|
||
body: Stack(
|
||
children: [
|
||
WebViewWidget(controller: _controller),
|
||
if (_isLoading)
|
||
const Center(child: CircularProgressIndicator()),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|