user_shop_page.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:webview_flutter/webview_flutter.dart';
  5. import 'package:webview_flutter_android/webview_flutter_android.dart';
  6. import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
  7. import '../../constant/config.dart';
  8. import '../../main.dart';
  9. import '../../model/user_model.dart';
  10. import '../../widget/my_txt.dart';
  11. class UserShopPage extends ConsumerStatefulWidget {
  12. // final String url;
  13. const UserShopPage({
  14. super.key,
  15. // required this.url,
  16. });
  17. @override
  18. ConsumerState<UserShopPage> createState() => _UserShopPageState();
  19. }
  20. class _UserShopPageState extends ConsumerState<UserShopPage> {
  21. String url = "https://news.xhrbxxf.com/shop";
  22. late final WebViewController _controller;
  23. var isLoading = true;
  24. var progress = 0;
  25. @override
  26. void dispose() {
  27. // TODO: implement dispose
  28. super.dispose();
  29. }
  30. @override
  31. void initState() {
  32. super.initState();
  33. UserModel user = ref.read(globalUserProvider);
  34. // 平台特定的初始化
  35. late final PlatformWebViewControllerCreationParams params;
  36. if (WebViewPlatform.instance is WebKitWebViewPlatform) {
  37. params = WebKitWebViewControllerCreationParams(
  38. allowsInlineMediaPlayback: true,
  39. mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
  40. );
  41. } else {
  42. params = const PlatformWebViewControllerCreationParams();
  43. }
  44. final WebViewController controller =
  45. WebViewController.fromPlatformCreationParams(params);
  46. // 通用设置
  47. controller
  48. ..setJavaScriptMode(JavaScriptMode.unrestricted)
  49. ..setNavigationDelegate(
  50. NavigationDelegate(
  51. onProgress: (int progress) {
  52. if (!mounted) return;
  53. setState(() {
  54. this.progress = progress;
  55. if (progress == 100) {
  56. isLoading = false;
  57. }
  58. });
  59. },
  60. onPageStarted: (String url) {
  61. if (!mounted) return;
  62. setState(() => isLoading = true);
  63. },
  64. onPageFinished: (String url) {
  65. if (!mounted) return;
  66. setState(() => isLoading = false);
  67. },
  68. onWebResourceError: (WebResourceError error) {
  69. if (!mounted) return;
  70. debugPrint('''
  71. WebView error:
  72. code: ${error.errorCode}
  73. description: ${error.description}
  74. errorType: ${error.errorType}
  75. isForMainFrame: ${error.isForMainFrame}
  76. ''');
  77. },
  78. ),
  79. )
  80. ..loadRequest(Uri.parse(user.shopUrl ?? url));
  81. // Android 特定设置
  82. if (controller.platform is AndroidWebViewController) {
  83. AndroidWebViewController.enableDebugging(true);
  84. (controller.platform as AndroidWebViewController)
  85. .setMediaPlaybackRequiresUserGesture(false);
  86. }
  87. _controller = controller;
  88. }
  89. @override
  90. Widget build(BuildContext context) {
  91. return Scaffold(
  92. backgroundColor: Colors.white,
  93. resizeToAvoidBottomInset: false,
  94. appBar: AppBar(
  95. title: myTxt(
  96. text: '积分商城',
  97. fontSize: 18.sp,
  98. fontWeight: FontWeight.bold,
  99. ),
  100. centerTitle: true,
  101. leading: IconButton(
  102. icon: const Icon(Icons.arrow_back_ios),
  103. onPressed: () async {
  104. if (!mounted) return;
  105. if (await _controller.canGoBack()) {
  106. _controller.goBack();
  107. } else {
  108. if (Navigator.canPop(context)) {
  109. eventBus.fire('mainCall');
  110. Navigator.pop(context);
  111. }
  112. }
  113. },
  114. ),
  115. // actions: [
  116. // IconButton(
  117. // icon: const Icon(Icons.refresh),
  118. // onPressed: () => _controller.reload(),
  119. // ),
  120. // ],
  121. ),
  122. body: Stack(
  123. children: [
  124. SafeArea(top: false, child: WebViewWidget(controller: _controller)),
  125. if (isLoading)
  126. LinearProgressIndicator(
  127. value: progress / 100,
  128. backgroundColor: Colors.grey[200],
  129. valueColor: AlwaysStoppedAnimation<Color>(
  130. Theme.of(context).primaryColor,
  131. ),
  132. ),
  133. ],
  134. ),
  135. );
  136. }
  137. }