This commit is contained in:
wgh19
2024-05-16 14:32:47 +08:00
parent 2f72437fc1
commit 872a2e13cf
4 changed files with 127 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:pixes/foundation/app.dart';
import 'package:pixes/network/network.dart';
import 'package:pixes/pages/webview_page.dart';
import 'package:pixes/utils/app_links.dart';
import 'package:pixes/utils/translation.dart';
import 'package:url_launcher/url_launcher_string.dart';
@@ -186,7 +187,6 @@ class _LoginPageState extends State<LoginPage> {
void onContinue() async {
var url = await Network().generateWebviewUrl();
launchUrlString(url);
onLink = (uri) {
if (uri.scheme == "pixiv") {
onFinished(uri.queryParameters["code"]!);
@@ -198,6 +198,18 @@ class _LoginPageState extends State<LoginPage> {
setState(() {
waitingForAuth = true;
});
if(App.isMobile && mounted) {
context.to(() => WebviewPage(url, onNavigation: (req) {
if(req.url.startsWith("pixiv://")) {
App.rootNavigatorKey.currentState!.pop();
onLink?.call(Uri.parse(req.url));
return false;
}
return true;
},));
} else {
launchUrlString(url);
}
}
void onFinished(String code) async {

View File

@@ -0,0 +1,81 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:pixes/components/md.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../foundation/app.dart';
double get _appBarHeight => App.isDesktop ? 36.0 : 48.0;
class WebviewPage extends StatefulWidget {
const WebviewPage(this.url, {this.onNavigation, super.key});
final String url;
final bool Function(NavigationRequest req)? onNavigation;
@override
State<WebviewPage> createState() => _WebviewPageState();
}
class _WebviewPageState extends State<WebviewPage> {
WebViewController? controller;
@override
void initState() {
super.initState();
}
NavigationDecision handleNavigation(NavigationRequest req) {
if (widget.onNavigation != null) {
return widget.onNavigation!(req)
? NavigationDecision.navigate
: NavigationDecision.prevent;
}
return NavigationDecision.navigate;
}
@override
Widget build(BuildContext context) {
controller ??= WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(FluentTheme.of(context).brightness == Brightness.light
? Colors.white
: Colors.black)
..setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// Update loading bar.
},
onPageStarted: (String url) {},
onPageFinished: (String url) {},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: handleNavigation,
),
)
..loadRequest(Uri.parse(widget.url));
return Column(
children: [
SizedBox(
height: _appBarHeight,
child: Row(
children: [
const Text("Webview"),
const Spacer(),
IconButton(
icon: const Icon(MdIcons.open_in_new, size: 20,),
onPressed: () {
launchUrlString(widget.url);
context.pop();
},
),
],
).paddingHorizontal(16),
).paddingTop(MediaQuery.of(context).padding.top),
Expanded(
child: WebViewWidget(controller: controller!,),
),
],
);
}
}