Skip to content

Commit 79dfaa1

Browse files
committed
Fix bug with StreamController sync
StreamControllers used to fire synchronously but now have an optional sync property in the constructor. Must only use sync StreamControllers for our events.
1 parent 84d37be commit 79dfaa1

File tree

3 files changed

+14
-20
lines changed

3 files changed

+14
-20
lines changed

lib/html5_dnd.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ class Draggable {
111111
// -------------------
112112
// Private
113113
// -------------------
114-
StreamController<DraggableEvent> _onDragStart = new StreamController<DraggableEvent>();
115-
StreamController<DraggableEvent> _onDrag = new StreamController<DraggableEvent>();
116-
StreamController<DraggableEvent> _onDragEnd = new StreamController<DraggableEvent>();
114+
StreamController<DraggableEvent> _onDragStart = new StreamController<DraggableEvent>(sync: true);
115+
StreamController<DraggableEvent> _onDrag = new StreamController<DraggableEvent>(sync: true);
116+
StreamController<DraggableEvent> _onDragEnd = new StreamController<DraggableEvent>(sync: true);
117117

118118
/**
119119
* Creates a draggable with the specified [element].
@@ -366,10 +366,10 @@ class Dropzone {
366366
// ----------
367367
// Events
368368
// ----------
369-
StreamController<DropzoneEvent> _onDragEnter = new StreamController<DropzoneEvent>();
370-
StreamController<DropzoneEvent> _onDragOver = new StreamController<DropzoneEvent>();
371-
StreamController<DropzoneEvent> _onDragLeave = new StreamController<DropzoneEvent>();
372-
StreamController<DropzoneEvent> _onDrop = new StreamController<DropzoneEvent>();
369+
StreamController<DropzoneEvent> _onDragEnter = new StreamController<DropzoneEvent>(sync: true);
370+
StreamController<DropzoneEvent> _onDragOver = new StreamController<DropzoneEvent>(sync: true);
371+
StreamController<DropzoneEvent> _onDragLeave = new StreamController<DropzoneEvent>(sync: true);
372+
StreamController<DropzoneEvent> _onDrop = new StreamController<DropzoneEvent>(sync: true);
373373

374374
/**
375375
* Fired when the mouse is first moved over this dropzone while dragging the

lib/html5_sortable.dart

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class Sortable {
7272
/// Callback function that is called when the drag is ended by a drop.
7373
/// If the user aborted the drag, the function is not called.
7474
StreamController<SortableResult> _onSortableComplete =
75-
new StreamController<SortableResult>();
75+
new StreamController<SortableResult>(sync: true);
7676

7777
static final RegExp _floatRegExp = new RegExp(r'left|right');
7878

@@ -114,6 +114,7 @@ class Sortable {
114114
_placeholder = new _Placeholder(event.draggable.element, placeholderClass,
115115
forcePlaceholderSize);
116116
_placeholder.onDrop.listen((_) {
117+
_dropped = true;
117118
_showDraggable(_placeholder.placeholderPosition);
118119
});
119120
})
@@ -124,6 +125,7 @@ class Sortable {
124125
// Not dropped. This means the drag ended outside of a placeholder or
125126
// the drag was cancelled somehow (ESC-key, ...)
126127
// Revert to state before dragging.
128+
_logger.finest('onDragEnd not dropped -> Revert to state before dragging');
127129
_showDraggable(_originalPosition);
128130
}
129131

@@ -172,17 +174,9 @@ class Sortable {
172174
}
173175
}
174176
});
175-
176-
dropzone.onDrop.listen((DropzoneEvent event) {
177-
// Return if drag is not from this sortable.
178-
if (_placeholder == null) return;
179-
_logger.finest('dropzone onDrop');
180-
_showDraggable(_placeholder.placeholderPosition);
181-
});
182177
}
183178

184179
void _showDraggable(Position newPosition) {
185-
_dropped = true;
186180
_placeholder.placeholderElement.remove();
187181
newPosition.insert(currentDraggable.element);
188182

@@ -209,7 +203,8 @@ class _Placeholder {
209203
/// Fired when a drag element has been dropped in this placeholder.
210204
Stream<_Placeholder> get onDrop => _onDrop.stream;
211205

212-
StreamController<_Placeholder> _onDrop = new StreamController<_Placeholder>();
206+
StreamController<_Placeholder> _onDrop =
207+
new StreamController<_Placeholder>(sync: true);
213208

214209
/**
215210
* Creates a new placeholder for the specified [draggableElement].

lib/src/html5_utils.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,8 @@ bool get supportsSetDragImage {
5050
// Call via javascript function.
5151
_supportsSetDragImage = js.context.supportsSetDragImage();
5252
} on NoSuchMethodError {
53-
_logger.severe('JavaScript method "supportsSetDragImage()" not found. Please'
54-
+ ' load the file "dnd.polyfill.js" in your application html.');
55-
_lazySupportsSetDragImage = false;
53+
_logger.severe('JavaScript method "supportsSetDragImage()" not found. Please load the file "dnd.polyfill.js" in your application html.');
54+
_supportsSetDragImage = false;
5655
} catch(e) {
5756
_logger.severe('Calling "supportsSetDragImage()" via JavaScript failed: '
5857
+ e.toString());

0 commit comments

Comments
 (0)