Compare commits

..

2 Commits

4 changed files with 197 additions and 208 deletions

View File

@ -30,13 +30,12 @@ class SyncSocket {
RawDatagramSocket? socket; RawDatagramSocket? socket;
// IC 0 1 // IC 0 1
int ic = 0; int ic = 1;
/// ip /// ip
List<String> childrenIp = []; List<String> childrenIp = [];
connect() async { connect() async {
socket?.close();
socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
// //
@ -79,48 +78,11 @@ class SyncSocket {
if (data['op'] == 11){ if (data['op'] == 11){
} }
// ip
if (data['Arr'] != null){
List arr = data['Arr'];
List<String> ips = [];
arr.forEach((clientMap) {
String ip = clientMap['Client'];
ips.add(ip);
});
childrenIp = ips;
}
}); });
} }
///
sendClickMessage(Map data){
Map messageMap = {
"op": 2,
"click": data
};
socket?.send(dataMake(messageMap), InternetAddress(url), port);
}
///
sendGetChilds(){
Map messageMap = {
"op": 3,
};
socket?.send(dataMake(messageMap), InternetAddress(url), port);
}
///
sendInpuMessage(int num){
Map messageMap = {
"op": 2,
"input": num
};
socket?.send(dataMake(messageMap), InternetAddress(url), port);
}
/// ///
heartbeat(){ heartbeat(){
Timer timer = Timer(const Duration(seconds: 10), () async { Timer timer = Timer(const Duration(seconds: 10), () async {

View File

@ -18,53 +18,22 @@ class SynchronizationWebTool{
return _instance!; return _instance!;
} }
bool webSync = false;
///
late WebviewController mainController;
/// ///
List<WebviewController> _childControllers = []; List<WebviewController> _childControllers = [];
/// js /// js
setChildController(List<WebviewController> childControllers){ setChildController(List<WebviewController> childControllers){
for (var controller in childControllers) { // for (var controller in childControllers) {
controller.addScriptToExecuteOnDocumentCreated(WindowsJs.clickEventJs); // controller.addScriptToExecuteOnDocumentCreated(WindowsJs.clickEventJs);
// controller.addScriptToExecuteOnDocumentCreated(WindowsJs.onloadZoom(90)); // // controller.addScriptToExecuteOnDocumentCreated(WindowsJs.onloadZoom(90));
} // }
mainController = childControllers.first; _childControllers = childControllers;
_childControllers = childControllers.sublist(1,10);
// //
// mainController.addScriptToExecuteOnDocumentCreated(WindowsJs.scrollEventJs); // mainController.addScriptToExecuteOnDocumentCreated(WindowsJs.scrollEventJs);
mainController.webMessage.listen((event) {
print('mainController listen --');
if (event['scroll'] != null ) {
print(event);
}
if (!webSync) return;
if (event['click'] != null) {
Map click = event['click'];
int x = click['x'] as int;
int y = click['y'] as int;
clickSynchronization(x, y);
SocketUtils.getInstance().sendClickMessage(click);
}
if (event['scroll'] != null ) {
print(event);
int y = event['y'] as int;
scrollSynchronization(y);
}
});
} }
List<WebviewController> get childController{ List<WebviewController> get childController{

View File

@ -1,20 +1,30 @@
import 'package:common/utils/toast_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:web_synchronization_tool/windows/number_tool.dart';
import 'package:web_synchronization_tool/windows/socket_tool.dart'; import 'package:web_synchronization_tool/windows/socket_tool.dart';
import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart'; import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart';
import 'package:web_synchronization_tool/windows/windowsJs.dart';
import 'package:webview_windows/webview_windows.dart'; import 'package:webview_windows/webview_windows.dart';
class WebGridController { class WebGridController {
Function(WebviewController controller)? addWebControllerBlack; Function(WebviewController controller)? addWebControllerBlack;
Function? addWebBlack;
Function? addAllWebBlack;
addWebController(WebviewController controller) { addMainController(WebviewController controller) {
if (addWebControllerBlack != null) { if (addWebControllerBlack != null) {
addWebControllerBlack!(controller); addWebControllerBlack!(controller);
} }
} }
addWeb() {
if (addWebBlack != null) {
addWebBlack!();
}
}
addAllWeb() {
if (addAllWebBlack != null) {
addAllWebBlack!();
}
}
} }
class WebGridWidget extends StatefulWidget { class WebGridWidget extends StatefulWidget {
@ -27,88 +37,135 @@ class WebGridWidget extends StatefulWidget {
} }
class _WebGridWidgetState extends State<WebGridWidget> { class _WebGridWidgetState extends State<WebGridWidget> {
List<WebviewController> controllers = []; List<WebviewController> controllers = [];
bool initDone = false; bool initDone = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
controllerInit(); widget.controller.addWebBlack = () {
addController();
};
widget.controller.addAllWebBlack = () {
addAllController();
};
} }
/// //
Future controllerInit() async { addController() async {
if (controllers.length >= 10) return;
for (var i = 0; i< 10 ; i++) { var controller = WebviewController();
await controller.initialize();
controller.loadUrl('https://www.df6831.com/');
controllers.add(controller);
SynchronizationWebTool.getInstance().setChildController(controllers);
setState(() {});
}
// 10
addAllController() async {
final num = 10 - controllers.length;
if (num < 1) return;
for (int i = 0; i < num; i++) {
var controller = WebviewController(); var controller = WebviewController();
await controller.initialize(); await controller.initialize();
controller.loadUrl('https://www.df6831.com/'); controller.loadUrl('https://www.df6831.com/');
// controller.executeScript(WindowsJs.zoom(35));
// controller.addScriptToExecuteOnDocumentCreated(WindowsJs.onloadZoom(35));
controllers.add(controller); controllers.add(controller);
} }
SynchronizationWebTool.getInstance().setChildController(controllers); SynchronizationWebTool.getInstance().setChildController(controllers);
setState(() {});
setState(() {
initDone = true;
});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GridView.builder( return Stack(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( children: [
crossAxisCount: 5, // GridView.builder(
crossAxisSpacing: 8.0, // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
mainAxisSpacing: 8.0, // crossAxisCount: 5, //
childAspectRatio: 0.9), crossAxisSpacing: 8.0, //
itemBuilder: (BuildContext context, int index) { mainAxisSpacing: 8.0, //
return Stack( childAspectRatio: 0.9),
children: [ itemBuilder: (BuildContext context, int index) {
Webview(controllers[index]), return Stack(
TextButton( children: [
style: ButtonStyle( Webview(controllers[index]),
overlayColor: MaterialStateProperty.resolveWith( TextButton(
(states) => Colors.transparent)), style: ButtonStyle(
onPressed: () { overlayColor: MaterialStateProperty.resolveWith(
(states) => Colors.transparent)),
onPressed: () {
var controller = controllers[index];
// controller.executeScript(WindowsJs.zoom(100));
var controller = controllers[index]; // showAnimationDialog(
// controller.executeScript(WindowsJs.zoom(100)); // context: context,
// // barrierDismissible: false,
// child: ShowWebWidget(controller: controller,));
// showAnimationDialog( // Navigator.push(context, MaterialPageRoute(builder: (context)=> ShowWebWidget(controller: controller,) ));
// context: context,
// // barrierDismissible: false,
// child: ShowWebWidget(controller: controller,));
// Navigator.push(context, MaterialPageRoute(builder: (context)=> ShowWebWidget(controller: controller,) )); Navigator.of(context).push(PageRouteBuilder(
opaque: false, //
Navigator.of(context).push(PageRouteBuilder( pageBuilder: (BuildContext context, _, __) =>
opaque: false, // ShowWebWidget(
pageBuilder: (BuildContext context, _, __) => ShowWebWidget(controller: controller,main: index == 0,), controller: controller,
)); main: index == 0,
allLoadUrl: (String url) {
}, controllers.forEach((controller) {
child: Container(), controller.loadUrl(url);
) });
], },
); ),
}, ));
itemCount: controllers.length, // 20 },
child: Container(),
),
Container(
alignment: Alignment.topRight,
child: TextButton(
style: TextButton.styleFrom(padding: const EdgeInsets.all(0)),
onPressed: () {
controllers.removeAt(index);
SynchronizationWebTool.getInstance()
.setChildController(controllers);
setState(() {});
},
child: Container(
width: 50,
height: 50,
color: Colors.blue[100],
alignment: Alignment.center,
child: const Icon(Icons.clear)),
),
)
],
);
},
itemCount: controllers.length, // 20
)
],
); );
} }
} }
class ShowWebWidget extends StatefulWidget { class ShowWebWidget extends StatefulWidget {
const ShowWebWidget({super.key, required this.controller, this.main = false}); const ShowWebWidget(
{super.key,
required this.controller,
this.main = false,
required this.allLoadUrl});
final WebviewController controller; final WebviewController controller;
final Function(String url) allLoadUrl;
final bool main; final bool main;
@override @override
@ -116,13 +173,11 @@ class ShowWebWidget extends StatefulWidget {
} }
class _ShowWebWidgetState extends State<ShowWebWidget> { class _ShowWebWidgetState extends State<ShowWebWidget> {
///
TextEditingController urlController = TextEditingController();
/// /// ip
TextEditingController urlController = TextEditingController(); TextEditingController ipController = TextEditingController();
///
TextEditingController numController = TextEditingController();
/// ip
TextEditingController ipController = TextEditingController();
@override @override
void dispose() { void dispose() {
@ -149,26 +204,15 @@ class _ShowWebWidgetState extends State<ShowWebWidget> {
); );
} }
Widget getTitleWidget(){ Widget getTitleWidget() {
if (widget.main == false) return input(); if (widget.main == false) return input();
return Row( return Row(
children: [ children: [
inputNumber(), // TextButton(
Row( // onPressed: () {
children: [ // widget.controller.openDevTools();
const Text('同步'), // },
Switch( // child: const Text('开发者')),
value: SynchronizationWebTool.getInstance().webSync,
onChanged: (value) {
setState(() {
SynchronizationWebTool.getInstance().webSync = value;
if (value){ //
SocketUtils.getInstance().sendGetChilds();
}
});
})
],
),
input(), input(),
ipSet() ipSet()
], ],
@ -176,69 +220,61 @@ class _ShowWebWidgetState extends State<ShowWebWidget> {
} }
/// ///
input(){ input() {
return Row( return Row(
children: [ children: [
SizedBox(width: 400, child: TextField(style: const TextStyle(fontSize: 14),controller: urlController,)), SizedBox(
TextButton(onPressed: (){ width: 400,
String url = urlController.text; child: TextField(
// if (!url.startsWith("https://") ) { style: const TextStyle(fontSize: 14),
// url = "https://$url"; controller: urlController,
// } )),
widget.controller.loadUrl(url); TextButton(
}, child: const Text('跳转',style: TextStyle(fontSize: 14),)) onPressed: () {
String url = urlController.text;
// if (!url.startsWith("https://") ) {
// url = "https://$url";
// }
widget.controller.loadUrl(url);
},
child: const Text(
'跳转',
style: TextStyle(fontSize: 14),
)),
TextButton(
onPressed: () {
String url = urlController.text;
widget.allLoadUrl(url);
},
child: const Text(
'全部跳转',
style: TextStyle(fontSize: 14),
)),
], ],
); );
} }
ipSet(){ ipSet() {
ipController.text = SocketUtils.getInstance().url; ipController.text = SocketUtils.getInstance().url;
return Row( return Row(
children: [ children: [
SizedBox(width: 100, child: TextField(style: const TextStyle(fontSize: 14),controller: ipController,)), SizedBox(
TextButton(onPressed: (){ width: 100,
SocketUtils.getInstance().url = ipController.text; child: TextField(
SocketUtils.getInstance().connect(); style: const TextStyle(fontSize: 14),
}, child: const Text('保存服务器ip',style: TextStyle(fontSize: 14),)) controller: ipController,
], )),
);
}
///
inputNumber(){
return Row(
children: [
SizedBox(width: 100, child: TextField(style: const TextStyle(fontSize: 14),controller: numController,)),
TextButton( TextButton(
onPressed: () { onPressed: () {
try{ SocketUtils.getInstance().url = ipController.text;
int num = int.parse(numController.text); SocketUtils.getInstance().connect();
int chidNum = SocketUtils.getInstance().childrenIp.length + 1;
if (num <= chidNum * 10){
numController.text = '不能小于${chidNum*10}';
ToastUtils.showToast('金额不能太小');
return;
}
int maxNum = num ~/ chidNum;
SocketUtils.getInstance().sendInpuMessage(maxNum);
//
List<int> nums = NumberTool().randomNum(maxNum);
widget.controller.executeScript(WindowsJs.inputJs(nums.first));
nums.removeAt(0);
SynchronizationWebTool.getInstance().input(nums);
}catch(e){
ToastUtils.showToast('请输入数字');
}
}, },
child: const Text('填入总金额')), child: const Text(
'保存服务器ip',
style: TextStyle(fontSize: 14),
))
], ],
); );
} }
} }

View File

@ -52,7 +52,7 @@ class _WindowsPageState extends State<WindowsPage> {
mainController.loadUrl('http://www.df6831.com/'); mainController.loadUrl('http://www.df6831.com/');
gridController.addWebController(mainController); gridController.addMainController(mainController);
setState(() { setState(() {
initDone = true; initDone = true;
@ -61,13 +61,35 @@ class _WindowsPageState extends State<WindowsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (initDone == false) return Container();
return Scaffold( return Scaffold(
body: WebGridWidget( body: WebGridWidget(
controller: gridController, controller: gridController,
), ),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: (){
gridController.addWeb();
},
heroTag: 1,
tooltip: '添加网页',
child: const Icon(Icons.add),
),
const SizedBox(width: 20,)
,
FloatingActionButton(
onPressed: (){
gridController.addAllWeb();
},
heroTag: 2,
tooltip: '添加10个网页',
child: const Row(
children: [Icon(Icons.add),Text('10')],
),
),
],
),
); );
} }