Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx_webview_flutter
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
clx_webview_flutter
Commits
5a7ef944
提交
5a7ef944
authored
6月 13, 2025
作者:
MrQi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加基类
上级
e1d9a55a
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
85 行增加
和
117 行删除
+85
-117
clx_webview_flutter.dart
lib/clx_webview_flutter.dart
+1
-1
listenable_view_model.dart
lib/custom_webview/view_model/listenable_view_model.dart
+0
-59
web_view_model.dart
lib/custom_webview/view_model/web_view_model.dart
+77
-51
listenable_webview.dart
lib/custom_webview/widgets/listenable_webview.dart
+2
-2
scaffold_webview.dart
lib/custom_webview/widgets/scaffold_webview.dart
+2
-2
captcha_util.dart
lib/utils/captcha_util.dart
+3
-2
没有找到文件。
lib/clx_webview_flutter.dart
浏览文件 @
5a7ef944
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'
;
...
...
lib/custom_webview/view_model/listenable_view_model.dart
deleted
100644 → 0
浏览文件 @
e1d9a55a
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
);
}
}
lib/custom_webview/view_model/
scallold
_view_model.dart
→
lib/custom_webview/view_model/
web
_view_model.dart
浏览文件 @
5a7ef944
...
...
@@ -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
,
Scallold
WebView
ViewModel
.
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
,
Scallold
WebView
ViewModel
.
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
);
}
}
lib/custom_webview/widgets/listenable_webview.dart
浏览文件 @
5a7ef944
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
Listenable
WebView
ViewModel
customController
;
const
ListenableWebView
({
super
.
key
,
required
this
.
customController
});
...
...
lib/custom_webview/widgets/scaffold_webview.dart
浏览文件 @
5a7ef944
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
Scallold
WebView
ViewModel
customController
;
const
ScaffoldWebView
({
super
.
key
,
required
this
.
customController
});
...
...
lib/utils/captcha_util.dart
浏览文件 @
5a7ef944
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
Scallold
WebView
ViewModel
customController
=
Scallold
WebView
ViewModel
.
loadRequest
(
requestedUrl:
Uri
.
parse
(
uri
),
title:
'验证码'
);
customController
.
setJavaScriptChannels
(
JavaScriptChannel
(
name:
'H5CallFlutterInterface'
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论