fix:对齐金值,主要注销,一键登录等方面修改

This commit is contained in:
jingyun committed 2026-09-08 17:42:17 +08:00
1 parent e29ed0a2c8
commit 6997a65c96
37 files changed
+3442 -514

No files matched your search

@@ -571,13 +571,13 @@ class _MallWebHostState extends ConsumerState<MallWebHost>
final mallAuth = logged ? await _issueMallAuthToken() : null;
if (!mounted) return;
final arguments = buildEnterWebMallBridgeArguments(
config: ref.read(mallTabConfigProvider),
currentUri: uri!,
logged: logged,
isDark: Theme.of(context).brightness == Brightness.dark,
authToken: mallAuth?.authToken,
scene: mallAuth?.scene,
sourceApp: mallAuth?.sourceApp,
attribution: ref.read(mallClickAttributionProvider),
);
_callH5Handler(JsEvent('enterWebMall', [arguments]));
}
+26 -19
View File
@@ -1,8 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:go_router/go_router.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../application/web_navigation_policy.dart';
/// Shared HTTPS WebView host. Mall-specific residency and attribution are
/// layered above this page so ordinary H5 links never receive mall state.
class AppWebPage extends StatefulWidget {
@@ -10,12 +13,10 @@ class AppWebPage extends StatefulWidget {
super.key,
required this.initialUri,
this.hideTitle = false,
this.allowedHosts = const <String>{},
});
final Uri initialUri;
final bool hideTitle;
final Set<String> allowedHosts;
@override
State<AppWebPage> createState() => _AppWebPageState();
@@ -60,23 +61,19 @@ class _AppWebPageState extends State<AppWebPage> {
NavigationDecision _onNavigationRequest(NavigationRequest request) {
final uri = Uri.tryParse(request.url);
if (uri == null || !_isHttp(uri)) return NavigationDecision.prevent;
if (_allowsInApp(uri)) return NavigationDecision.navigate;
launchUrl(uri, mode: LaunchMode.externalApplication);
return NavigationDecision.prevent;
if (uri != null && shouldOpenWebUrlExternally(request.url)) {
launchUrl(uri, mode: LaunchMode.externalApplication);
return NavigationDecision.prevent;
}
if (uri == null || !_isAllowedWebUri(uri)) {
return NavigationDecision.prevent;
}
// Align with jinzhi-flutter-app: a normal HTTPS navigation stays in this
// WebView even when its host changes. H5 opts into an external handoff
// through `out`, which is handled above.
return NavigationDecision.navigate;
}
bool _allowsInApp(Uri uri) {
final host = uri.host.toLowerCase();
if (host == widget.initialUri.host.toLowerCase()) return true;
return widget.allowedHosts.any(
(allowed) => host == allowed || host.endsWith('.$allowed'),
);
}
bool _isHttp(Uri uri) =>
uri.hasAuthority && (uri.scheme == 'https' || uri.scheme == 'http');
Future<bool> _onPop() async {
if (await _controller.canGoBack()) {
await _controller.goBack();
@@ -118,6 +115,16 @@ class _AppWebPageState extends State<AppWebPage> {
Uri? parseSafeWebUri(String? raw) {
final uri = Uri.tryParse(raw?.trim() ?? '');
if (uri == null || !uri.hasAuthority) return null;
return uri.scheme == 'https' || uri.scheme == 'http' ? uri : null;
return uri != null && _isAllowedWebUri(uri) ? uri : null;
}
bool _isAllowedWebUri(Uri uri) {
if (!uri.hasAuthority || uri.host.isEmpty) return false;
if (uri.scheme.toLowerCase() == 'https') return true;
if (kReleaseMode || uri.scheme.toLowerCase() != 'http') return false;
return const {
'localhost',
'127.0.0.1',
'::1',
}.contains(uri.host.toLowerCase());
}