提交 75995c16 authored 作者: MrQi's avatar MrQi

增加方法

上级 f4db7484
library clx_webview_flutter; library clx_webview_flutter;
export 'custom_webview/view_model/custom_controller.dart'; export 'custom_webview/view_model/scallold_view_model.dart';
export 'custom_webview/widgets/custom_webview.dart'; export 'custom_webview/widgets/scaffold_webview.dart';
export 'custom_webview/model/java_script_channel.dart'; export 'custom_webview/model/java_script_channel.dart';
export 'package:webview_flutter/webview_flutter.dart'; export 'package:webview_flutter/webview_flutter.dart';
......
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../model/java_script_channel.dart';
class ListenableViewModel extends ChangeNotifier {
ListenableViewModel.loadRequest({required Uri requestedUrl}) {
_controller = WebViewController();
_controller.loadRequest(requestedUrl);
}
ListenableViewModel.loadHtmlString({required String html, String? baseUrl}) {
_controller = WebViewController();
_controller.loadHtmlString(html, baseUrl: baseUrl);
}
ListenableViewModel.loadFile({required String absoluteFilePath}) {
_controller = WebViewController();
_controller.loadFile(absoluteFilePath);
}
/// 外部访问WebViewController的接口
late WebViewController _controller;
WebViewController get controller => _controller;
/// 外部访问JavaScriptChannel的接口
final List<JavaScriptChannel> _javaScriptChannels = [];
List<JavaScriptChannel>? get javaScriptChannels => _javaScriptChannels;
Future<bool> setJavaScriptChannels(JavaScriptChannel channel) async {
if (_javaScriptChannels
.where((element) => element.name == channel.name)
.isNotEmpty) {
return Future.value(false);
}
_javaScriptChannels.add(channel);
controller.addJavaScriptChannel(channel.name,
onMessageReceived: channel.channelCallback.run);
controller.reload();
return Future.value(true);
}
Future<bool> removeJavaScriptChannel(String name) async {
if (_javaScriptChannels.where((element) => element.name == name).isEmpty) {
return Future.value(false);
}
_javaScriptChannels.removeWhere((element) => element.name == name);
controller.removeJavaScriptChannel(name);
controller.reload();
return Future.value(true);
}
}
...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; ...@@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import '../model/java_script_channel.dart'; import '../model/java_script_channel.dart';
import '../widgets/custom_webview.dart'; import '../widgets/scaffold_webview.dart';
class CustomController extends ChangeNotifier { class ScalloldViewModel extends ChangeNotifier {
CustomController.loadRequest( ScalloldViewModel.loadRequest(
{required Uri requestedUrl, String? title, TextStyle? appBarTextStyle}) { {required Uri requestedUrl, String? title, TextStyle? appBarTextStyle}) {
_controller = WebViewController(); _controller = WebViewController();
_title = title; _title = title;
...@@ -15,7 +15,7 @@ class CustomController extends ChangeNotifier { ...@@ -15,7 +15,7 @@ class CustomController extends ChangeNotifier {
_controller.loadRequest(requestedUrl); _controller.loadRequest(requestedUrl);
} }
CustomController.loadHtmlString( ScalloldViewModel.loadHtmlString(
{required String html, {required String html,
String? baseUrl, String? baseUrl,
String? title, String? title,
...@@ -26,7 +26,7 @@ class CustomController extends ChangeNotifier { ...@@ -26,7 +26,7 @@ class CustomController extends ChangeNotifier {
_controller.loadHtmlString(html, baseUrl: baseUrl); _controller.loadHtmlString(html, baseUrl: baseUrl);
} }
CustomController.loadFile({ ScalloldViewModel.loadFile({
required String absoluteFilePath, required String absoluteFilePath,
String? title, String? title,
TextStyle? appBarTextStyle, TextStyle? appBarTextStyle,
...@@ -38,8 +38,8 @@ class CustomController extends ChangeNotifier { ...@@ -38,8 +38,8 @@ class CustomController extends ChangeNotifier {
} }
/// 内部访问WebView的接口 /// 内部访问WebView的接口
late CustomWebViewState _customWebViewState; late ScaffoldWebViewState _customWebViewState;
void bindState(CustomWebViewState state) { void bindState(ScaffoldWebViewState state) {
_customWebViewState = state; _customWebViewState = state;
} }
......
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../view_model/listenable_view_model.dart';
class ListenableWebView extends StatelessWidget {
final ListenableViewModel customController;
const ListenableWebView({super.key, required this.customController});
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: customController,
builder: (context, child) {
return WebViewWidget(controller: customController.controller);
},
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import '../view_model/custom_controller.dart'; import '../view_model/scallold_view_model.dart';
class CustomWebView extends StatefulWidget { class ScaffoldWebView extends StatefulWidget {
final CustomController customController; final ScalloldViewModel customController;
const CustomWebView({super.key, required this.customController}); const ScaffoldWebView({super.key, required this.customController});
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
return CustomWebViewState(); return ScaffoldWebViewState();
} }
} }
class CustomWebViewState extends State<CustomWebView> { class ScaffoldWebViewState extends State<ScaffoldWebView> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
......
...@@ -10,8 +10,9 @@ abstract class CaptchaUtil { ...@@ -10,8 +10,9 @@ abstract class CaptchaUtil {
onCaptchaGenerated}) async { onCaptchaGenerated}) async {
return await Navigator.push(context, PageRouteBuilder( return await Navigator.push(context, PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) { pageBuilder: (context, animation, secondaryAnimation) {
final CustomController customController = CustomController.loadRequest( final ScalloldViewModel customController =
requestedUrl: Uri.parse(uri), title: '验证码'); ScalloldViewModel.loadRequest(
requestedUrl: Uri.parse(uri), title: '验证码');
customController.setJavaScriptChannels(JavaScriptChannel( customController.setJavaScriptChannels(JavaScriptChannel(
name: 'H5CallFlutterInterface', name: 'H5CallFlutterInterface',
callback: (message) async { callback: (message) async {
...@@ -28,7 +29,7 @@ abstract class CaptchaUtil { ...@@ -28,7 +29,7 @@ abstract class CaptchaUtil {
} }
}, },
)); ));
return CustomWebView(customController: customController); return ScaffoldWebView(customController: customController);
}, },
)); ));
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论