import 'dart:async'; import 'dart:html'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; enum _DragState { dragging, notDragging, } class DropZone extends StatefulWidget { @override State createState() { return _DropZoneState(); } } class _DropZoneState extends State { StreamSubscription _onDragOverSubscription; StreamSubscription _onDropSubscription; final StreamController> _pointStreamController = new StreamController>.broadcast(); final StreamController<_DragState> _dragStateStreamController = new StreamController<_DragState>.broadcast(); @override void dispose() { this._onDropSubscription.cancel(); this._onDragOverSubscription.cancel(); this._pointStreamController.close(); this._dragStateStreamController.close(); super.dispose(); } List _files = []; void _onDrop(MouseEvent value) { value.stopPropagation(); value.preventDefault(); _pointStreamController.sink.add(null); _addFiles(value.dataTransfer.files); } void _addFiles(List newFiles) { this.setState(() { this._files = this._files..addAll(newFiles); /// TODO print(this._files); }); } void _onDragOver(MouseEvent value) { value.stopPropagation(); value.preventDefault(); this._pointStreamController.sink.add(Point(value.layer.x.toDouble(), value.layer.y.toDouble())); this._dragStateStreamController.sink.add(_DragState.dragging); } @override void initState() { super.initState(); this._onDropSubscription = document.body.onDrop.listen(_onDrop); this._onDragOverSubscription = document.body.onDragOver.listen(_onDragOver); } Widget _fileDrop(BuildContext context) { // styling return Padding( padding: const EdgeInsets.all(8.0), child: Container( height: MediaQuery.of(context).size.height - 200, decoration: BoxDecoration( border: Border.all( color: Color.fromRGBO(125, 125, 125, 0.7) ) ), ), ); } @override Widget build(BuildContext context) { return _fileDrop(context); } }