Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Prev Previous commit
Inject the dprChanged Stream from the constructor, instead of grabbin…
…g a static field directly.
  • Loading branch information
ditman committed Feb 6, 2024
commit 3f19731ee4e08bc3cf8daad6ca9573382d21fa41
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@ import 'dart:async';

import 'package:ui/src/engine/display.dart';
import 'package:ui/src/engine/dom.dart';
import 'package:ui/src/engine/view_embedder/display_dpr_stream.dart';
import 'package:ui/src/engine/window.dart';
import 'package:ui/ui.dart' as ui show Size;

import 'dimensions_provider.dart';

/// This class provides observable, real-time dimensions of a host element.
///
/// This class needs a `Stream` of `devicePixelRatio` changes, like the one
/// provided by [DisplayDprStream], because html resize observers do not report
/// DPR changes.
///
/// All the measurements returned from this class are potentially *expensive*,
/// and should be cached as needed. Every call to every method on this class
/// WILL perform actual DOM measurements.
Expand All @@ -24,9 +27,11 @@ import 'dimensions_provider.dart';
/// to be effective.
class CustomElementDimensionsProvider extends DimensionsProvider {
/// Creates a [CustomElementDimensionsProvider] from a [_hostElement].
CustomElementDimensionsProvider(this._hostElement) {
CustomElementDimensionsProvider(this._hostElement, {
Stream<double>? onDprChange,
}) {
// Send a resize event when the page DPR changes.
_dprChangeStreamSubscription = DisplayDprStream.instance.dprChanged.listen((_) {
_dprChangeStreamSubscription = onDprChange?.listen((_) {
_broadcastSize(null);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:async';

import 'package:meta/meta.dart';
import 'package:ui/src/engine/dom.dart';
import 'package:ui/src/engine/view_embedder/display_dpr_stream.dart';
import 'package:ui/src/engine/window.dart';
import 'package:ui/ui.dart' as ui show Size;

Expand All @@ -31,7 +32,10 @@ abstract class DimensionsProvider {
/// Creates the appropriate DimensionsProvider depending on the incoming [hostElement].
factory DimensionsProvider.create({DomElement? hostElement}) {
if (hostElement != null) {
return CustomElementDimensionsProvider(hostElement);
return CustomElementDimensionsProvider(
hostElement,
onDprChange: DisplayDprStream.instance.dprChanged,
);
} else {
return FullPageDimensionsProvider();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,24 +132,21 @@ void doTests() {

test('funnels DPR change events too', () async {
// Override the source of DPR events...
final DomEventTarget eventTarget = createDomElement('div');
DisplayDprStream.instance = DisplayDprStream(
EngineFlutterDisplay.instance,
overrides: DebugDisplayDprStreamOverrides(
getMediaQuery: (_) => eventTarget,
)
final StreamController<double> dprController =
StreamController<double>.broadcast();

// Inject the dprController stream into the CustomElementDimensionsProvider.
final CustomElementDimensionsProvider provider =
CustomElementDimensionsProvider(
sizeSource,
onDprChange: dprController.stream,
);
final CustomElementDimensionsProvider provider = CustomElementDimensionsProvider(sizeSource);

// The size that will be emitted by the provider eventually
final Future<ui.Size?> newSize = provider.onResize.first;

// Set the mock DPR value
// Set and broadcast the mock DPR value
EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(3.2);
// Simulate the mediaQuery change event from the browser
eventTarget.dispatchEvent(createDomEvent('Event', 'change'));
dprController.add(3.2);

expect(newSize, completes);
expect(provider.onResize.first, completes);
expect(provider.computePhysicalSize(), const ui.Size(32, 32));
});

Expand Down