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

增加基类

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