class WebViewPage extends StatefulWidget {
final String url;
final String title;
final VoidCallback onBack;
final VoidCallback onWebViewCreated;
final VoidCallback onWebViewLoaded;
final Function(int)? onWebViewProgress;
final Function(HttpResponseError)? onWebViewError;
const WebViewPage({
super.key,
required this.url,
required this.title,
required this.onBack,
required this.onWebViewCreated,
required this.onWebViewLoaded,
this.onWebViewProgress,
this.onWebViewError,
});
@override
State<WebViewPage> createState() => _WebViewPageState();
}
class _WebViewPageState extends State<WebViewPage> {
late WebViewController _controller;
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadRequest(Uri.parse(widget.url))
..setNavigationDelegate(
NavigationDelegate(
onPageStarted: (String url) {
widget.onWebViewCreated();
},
onPageFinished: (String url) {
widget.onWebViewLoaded();
},
onProgress: (int progress) {
widget.onWebViewProgress?.call(progress);
},
onHttpError: (HttpResponseError error) {
widget.onWebViewError?.call(error);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('加载失败: ${error}'),
duration: Duration(seconds: 2),
),
);
}
},
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title, textAlign: TextAlign.center),
centerTitle: true,
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: widget.onBack,
),
),
body: WebViewWidget(controller: _controller),
);
}
}