11import 'dart:async' ;
2- import 'dart:html' as html show window, Url;
2+ import 'dart:html' as html show window, Url, DataTransfer ;
33
44import 'package:flutter/cupertino.dart' ;
55import 'package:flutter/services.dart' ;
@@ -25,66 +25,92 @@ class DesktopDropWeb {
2525 pluginInstance._registerEvents ();
2626 }
2727
28+ html.DataTransfer ? _dataTransfer;
29+
2830 void _registerEvents () {
29- html.window.onDrop.listen ((event) {
30- event.preventDefault ();
31+ html.window.onDragEnter.listen (
32+ (event) {
33+ event.preventDefault ();
34+ _dataTransfer = event.dataTransfer;
35+ channel.invokeMethod ('entered' , [
36+ event.client.x.toDouble (),
37+ event.client.y.toDouble (),
38+ ]);
39+ },
40+ );
3141
32- final results = < WebDropItem > [];
42+ html.window.onDragOver.listen (
43+ (event) {
44+ event.preventDefault ();
45+ _dataTransfer = event.dataTransfer;
46+ channel.invokeMethod ('updated' , [
47+ event.client.x.toDouble (),
48+ event.client.y.toDouble (),
49+ ]);
50+ },
51+ );
3352
34- try {
35- final items = event.dataTransfer.files;
36- if (items != null ) {
37- for (final item in items) {
38- results.add (
39- WebDropItem (
40- uri: html.Url .createObjectUrl (item),
41- name: item.name,
42- size: item.size,
43- type: item.type,
44- relativePath: item.relativePath,
45- lastModified: item.lastModified != null
46- ? DateTime .fromMillisecondsSinceEpoch (item.lastModified! )
47- : item.lastModifiedDate,
48- ),
49- );
53+ html.window.onDrop.listen (
54+ (event) {
55+ event.preventDefault ();
56+ _dataTransfer = null ;
57+ final results = < WebDropItem > [];
58+
59+ try {
60+ final items = event.dataTransfer.files;
61+ if (items != null ) {
62+ for (final item in items) {
63+ results.add (
64+ WebDropItem (
65+ uri: html.Url .createObjectUrl (item),
66+ name: item.name,
67+ size: item.size,
68+ type: item.type,
69+ relativePath: item.relativePath,
70+ lastModified: item.lastModified != null
71+ ? DateTime .fromMillisecondsSinceEpoch (item.lastModified! )
72+ : item.lastModifiedDate,
73+ ),
74+ );
75+ }
5076 }
77+ } catch (e, s) {
78+ debugPrint ('desktop_drop_web: $e $s ' );
79+ } finally {
80+ channel.invokeMethod (
81+ "performOperation_web" ,
82+ results.map ((e) => e.toJson ()).toList (),
83+ );
5184 }
52- } catch (e, s) {
53- debugPrint ('desktop_drop_web: $e $s ' );
54- } finally {
55- channel.invokeMethod (
56- "performOperation_web" ,
57- results.map ((e) => e.toJson ()).toList (),
58- );
59- }
60- });
61-
62- html.window.onDragEnter.listen ((event) {
63- event.preventDefault ();
64- channel.invokeMethod ('entered' , [
65- event.client.x.toDouble (),
66- event.client.y.toDouble (),
67- ]);
68- });
69-
70- html.window.onDragOver.listen ((event) {
71- event.preventDefault ();
72- channel.invokeMethod ('updated' , [
73- event.client.x.toDouble (),
74- event.client.y.toDouble (),
75- ]);
76- });
85+ },
86+ );
7787
78- html.window.onDragLeave.listen ((event) {
79- event.preventDefault ();
80- channel.invokeMethod ('exited' , [
81- event.client.x.toDouble (),
82- event.client.y.toDouble (),
83- ]);
84- });
88+ html.window.onDragLeave.listen (
89+ (event) {
90+ event.preventDefault ();
91+ _dataTransfer = null ;
92+ channel.invokeMethod ('exited' , [
93+ event.client.x.toDouble (),
94+ event.client.y.toDouble (),
95+ ]);
96+ },
97+ );
8598 }
8699
87100 Future <dynamic > handleMethodCall (MethodCall call) async {
101+ switch (call.method) {
102+ case 'updateDroppableStatus' :
103+ final enable = call.arguments as bool ;
104+ final current = _dataTransfer? .dropEffect;
105+ final newValue = enable ? 'copy' : 'move' ;
106+ if (current != newValue) {
107+ _dataTransfer? .dropEffect = newValue;
108+ }
109+ return ;
110+ default :
111+ break ;
112+ }
113+
88114 throw PlatformException (
89115 code: 'Unimplemented' ,
90116 details: 'desktop_drop for web doesn\' t implement \' ${call .method }\' ' ,
0 commit comments