Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx_webview_flutter
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
clx_webview_flutter
Commits
75995c16
提交
75995c16
authored
6月 12, 2025
作者:
MrQi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加方法
上级
f4db7484
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
92 行增加
和
18 行删除
+92
-18
clx_webview_flutter.dart
lib/clx_webview_flutter.dart
+2
-2
listenable_view_model.dart
lib/custom_webview/view_model/listenable_view_model.dart
+53
-0
scallold_view_model.dart
lib/custom_webview/view_model/scallold_view_model.dart
+7
-7
listenable_webview.dart
lib/custom_webview/widgets/listenable_webview.dart
+20
-0
scaffold_webview.dart
lib/custom_webview/widgets/scaffold_webview.dart
+6
-6
captcha_util.dart
lib/utils/captcha_util.dart
+4
-3
没有找到文件。
lib/clx_webview_flutter.dart
浏览文件 @
75995c16
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'
;
...
...
lib/custom_webview/view_model/listenable_view_model.dart
0 → 100644
浏览文件 @
75995c16
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
);
}
}
lib/custom_webview/view_model/
custom_controller
.dart
→
lib/custom_webview/view_model/
scallold_view_model
.dart
浏览文件 @
75995c16
...
@@ -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
Custom
WebViewState
_customWebViewState
;
late
Scaffold
WebViewState
_customWebViewState
;
void
bindState
(
Custom
WebViewState
state
)
{
void
bindState
(
Scaffold
WebViewState
state
)
{
_customWebViewState
=
state
;
_customWebViewState
=
state
;
}
}
...
...
lib/custom_webview/widgets/listenable_webview.dart
0 → 100644
浏览文件 @
75995c16
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
);
},
);
}
}
lib/custom_webview/widgets/
custom
_webview.dart
→
lib/custom_webview/widgets/
scaffold
_webview.dart
浏览文件 @
75995c16
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
Custom
WebView
extends
StatefulWidget
{
class
Scaffold
WebView
extends
StatefulWidget
{
final
CustomController
customController
;
final
ScalloldViewModel
customController
;
const
Custom
WebView
({
super
.
key
,
required
this
.
customController
});
const
Scaffold
WebView
({
super
.
key
,
required
this
.
customController
});
@override
@override
State
<
StatefulWidget
>
createState
()
{
State
<
StatefulWidget
>
createState
()
{
return
Custom
WebViewState
();
return
Scaffold
WebViewState
();
}
}
}
}
class
CustomWebViewState
extends
State
<
Custom
WebView
>
{
class
ScaffoldWebViewState
extends
State
<
Scaffold
WebView
>
{
@override
@override
void
initState
()
{
void
initState
()
{
super
.
initState
();
super
.
initState
();
...
...
lib/utils/captcha_util.dart
浏览文件 @
75995c16
...
@@ -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
Custom
WebView
(
customController:
customController
);
return
Scaffold
WebView
(
customController:
customController
);
},
},
));
));
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论