提交 5a7ef944 authored 作者: MrQi's avatar MrQi

增加基类

上级 e1d9a55a
library clx_webview_flutter; library clx_webview_flutter;
export 'custom_webview/view_model/scallold_view_model.dart'; export 'custom_webview/view_model/web_view_model.dart';
export 'custom_webview/widgets/scaffold_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';
......
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);
}
Future<bool> showJavaScriptLog(
void Function(JavaScriptConsoleMessage message) onConsoleMessage) async {
controller.setOnConsoleMessage(onConsoleMessage);
return Future.value(true);
}
}
...@@ -6,35 +6,97 @@ import 'package:webview_flutter/webview_flutter.dart'; ...@@ -6,35 +6,97 @@ import 'package:webview_flutter/webview_flutter.dart';
import '../model/java_script_channel.dart'; import '../model/java_script_channel.dart';
import '../widgets/scaffold_webview.dart'; import '../widgets/scaffold_webview.dart';
class ScalloldViewModel extends ChangeNotifier { sealed class CLXWebViewBaseWebViewModel extends ChangeNotifier {
ScalloldViewModel.loadRequest( CLXWebViewBaseWebViewModel.loadRequest({required Uri requestedUrl}) {
{required Uri requestedUrl, String? title, TextStyle? appBarTextStyle}) {
_controller = WebViewController(); _controller = WebViewController();
_controller.loadRequest(requestedUrl);
}
CLXWebViewBaseWebViewModel.loadHtmlString(
{required String html, String? baseUrl}) {
_controller = WebViewController();
_controller.loadHtmlString(html, baseUrl: baseUrl);
}
CLXWebViewBaseWebViewModel.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);
}
Future<bool> showJavaScriptLog(
void Function(JavaScriptConsoleMessage message) onConsoleMessage) async {
controller.setOnConsoleMessage(onConsoleMessage);
return Future.value(true);
}
}
class ListenableWebViewViewModel extends CLXWebViewBaseWebViewModel {
ListenableWebViewViewModel.loadRequest({required super.requestedUrl})
: super.loadRequest();
ListenableWebViewViewModel.loadHtmlString(
{required super.html, super.baseUrl})
: super.loadHtmlString();
ListenableWebViewViewModel.loadFile({required super.absoluteFilePath})
: super.loadFile();
}
class ScalloldWebViewViewModel extends CLXWebViewBaseWebViewModel {
ScalloldWebViewViewModel.loadRequest(
{required super.requestedUrl, String? title, TextStyle? appBarTextStyle})
: super.loadRequest() {
_title = title; _title = title;
_appBarTextStyle = appBarTextStyle; _appBarTextStyle = appBarTextStyle;
_controller.loadRequest(requestedUrl);
} }
ScalloldViewModel.loadHtmlString( ScalloldWebViewViewModel.loadHtmlString(
{required String html, {required super.html,
String? baseUrl, super.baseUrl,
String? title, String? title,
TextStyle? appBarTextStyle}) { TextStyle? appBarTextStyle})
_controller = WebViewController(); : super.loadHtmlString() {
_title = title; _title = title;
_appBarTextStyle = appBarTextStyle; _appBarTextStyle = appBarTextStyle;
_controller.loadHtmlString(html, baseUrl: baseUrl);
} }
ScalloldViewModel.loadFile({ ScalloldWebViewViewModel.loadFile({
required String absoluteFilePath, required super.absoluteFilePath,
String? title, String? title,
TextStyle? appBarTextStyle, TextStyle? appBarTextStyle,
}) { }) : super.loadFile() {
_controller = WebViewController();
_title = title; _title = title;
_appBarTextStyle = appBarTextStyle; _appBarTextStyle = appBarTextStyle;
_controller.loadFile(absoluteFilePath);
} }
/// 内部访问WebView的接口 /// 内部访问WebView的接口
...@@ -43,10 +105,6 @@ class ScalloldViewModel extends ChangeNotifier { ...@@ -43,10 +105,6 @@ class ScalloldViewModel extends ChangeNotifier {
_customWebViewState = state; _customWebViewState = state;
} }
/// 外部访问WebViewController的接口
late WebViewController _controller;
WebViewController get controller => _controller;
/// 内部访问AppBar的title接口 /// 内部访问AppBar的title接口
String? _title; String? _title;
AppBar? get appBar => _title == null AppBar? get appBar => _title == null
...@@ -108,36 +166,4 @@ class ScalloldViewModel extends ChangeNotifier { ...@@ -108,36 +166,4 @@ class ScalloldViewModel extends ChangeNotifier {
notifyListeners(); notifyListeners();
return Future.value(true); return Future.value(true);
} }
/// 外部访问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);
}
Future<bool> showJavaScriptLog(
void Function(JavaScriptConsoleMessage message) onConsoleMessage) async {
controller.setOnConsoleMessage(onConsoleMessage);
return Future.value(true);
}
} }
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/listenable_view_model.dart'; import '../view_model/web_view_model.dart';
class ListenableWebView extends StatelessWidget { class ListenableWebView extends StatelessWidget {
final ListenableViewModel customController; final ListenableWebViewViewModel customController;
const ListenableWebView({super.key, required this.customController}); const ListenableWebView({super.key, required this.customController});
......
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/scallold_view_model.dart'; import '../view_model/web_view_model.dart';
class ScaffoldWebView extends StatefulWidget { class ScaffoldWebView extends StatefulWidget {
final ScalloldViewModel customController; final ScalloldWebViewViewModel customController;
const ScaffoldWebView({super.key, required this.customController}); const ScaffoldWebView({super.key, required this.customController});
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../clx_webview_flutter.dart'; import '../clx_webview_flutter.dart';
import '../custom_webview/view_model/web_view_model.dart';
abstract class CaptchaUtil { abstract class CaptchaUtil {
static Future<bool>? generateCaptcha( static Future<bool>? generateCaptcha(
...@@ -10,8 +11,8 @@ abstract class CaptchaUtil { ...@@ -10,8 +11,8 @@ 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 ScalloldViewModel customController = final ScalloldWebViewViewModel customController =
ScalloldViewModel.loadRequest( ScalloldWebViewViewModel.loadRequest(
requestedUrl: Uri.parse(uri), title: '验证码'); requestedUrl: Uri.parse(uri), title: '验证码');
customController.setJavaScriptChannels(JavaScriptChannel( customController.setJavaScriptChannels(JavaScriptChannel(
name: 'H5CallFlutterInterface', name: 'H5CallFlutterInterface',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论