Skip to content

Commit e79055e

Browse files
committed
Refactor sensor services and event models
Split sensor services into individual Dart files and refactor base class for sensor streams. In Python, move sensor event models into their respective service modules, update event timestamp types to datetime, and remove the shared sensor_events.py file. Update imports and public API accordingly for improved modularity and clarity.
1 parent b0359ff commit e79055e

File tree

15 files changed

+287
-293
lines changed

15 files changed

+287
-293
lines changed

packages/flet/lib/src/flet_core_extension.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,25 @@ import 'flet_service.dart';
108108
import 'models/control.dart';
109109
import 'services/browser_context_menu.dart';
110110
import 'services/battery.dart';
111+
import 'services/accelerometer.dart';
111112
import 'services/clipboard.dart';
112113
import 'services/connectivity.dart';
113114
import 'services/file_picker.dart';
115+
import 'services/barometer.dart';
114116
import 'services/haptic_feedback.dart';
117+
import 'services/gyroscope.dart';
118+
import 'services/magnetometer.dart';
115119
import 'services/share.dart';
116120
import 'services/semantics_service.dart';
117121
import 'services/shake_detector.dart';
118-
import 'services/sensors.dart';
119122
import 'services/shared_preferences.dart';
120123
import 'services/screen_brightness.dart';
121124
import 'services/storage_paths.dart';
122125
import 'services/tester.dart';
123126
import 'services/url_launcher.dart';
124127
import 'services/wakelock.dart';
125128
import 'services/window.dart';
129+
import 'services/user_accelerometer.dart';
126130
import 'utils/cupertino_icons.dart';
127131
import 'utils/material_icons.dart';
128132

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:sensors_plus/sensors_plus.dart';
2+
3+
import 'base_sensor.dart';
4+
5+
class AccelerometerService extends BaseSensorService<AccelerometerEvent> {
6+
AccelerometerService({required super.control});
7+
8+
@override
9+
Stream<AccelerometerEvent> sensorStream(Duration samplingPeriod) {
10+
return accelerometerEventStream(samplingPeriod: samplingPeriod);
11+
}
12+
13+
@override
14+
Map<String, dynamic> serializeEvent(AccelerometerEvent event) {
15+
return {
16+
"x": event.x,
17+
"y": event.y,
18+
"z": event.z,
19+
"timestamp": event.timestamp,
20+
};
21+
}
22+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:sensors_plus/sensors_plus.dart';
2+
3+
import 'base_sensor.dart';
4+
5+
class BarometerService extends BaseSensorService<BarometerEvent> {
6+
BarometerService({required super.control});
7+
8+
@override
9+
Stream<BarometerEvent> sensorStream(Duration samplingPeriod) {
10+
return barometerEventStream(samplingPeriod: samplingPeriod);
11+
}
12+
13+
@override
14+
Map<String, dynamic> serializeEvent(BarometerEvent event) {
15+
return {
16+
"pressure": event.pressure,
17+
"timestamp": event.timestamp,
18+
};
19+
}
20+
}

packages/flet/lib/src/services/sensors.dart renamed to packages/flet/lib/src/services/base_sensor.dart

Lines changed: 2 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import '../flet_service.dart';
77
import '../utils/numbers.dart';
88
import '../utils/time.dart';
99

10-
abstract class _SensorStreamService<T> extends FletService {
11-
_SensorStreamService({required super.control});
10+
abstract class BaseSensorService<T> extends FletService {
11+
BaseSensorService({required super.control});
1212

1313
StreamSubscription<T>? _subscription;
1414
bool _enabled = true;
@@ -102,97 +102,3 @@ abstract class _SensorStreamService<T> extends FletService {
102102
super.dispose();
103103
}
104104
}
105-
106-
class AccelerometerService extends _SensorStreamService<AccelerometerEvent> {
107-
AccelerometerService({required super.control});
108-
109-
@override
110-
Stream<AccelerometerEvent> sensorStream(Duration samplingPeriod) {
111-
return accelerometerEventStream(samplingPeriod: samplingPeriod);
112-
}
113-
114-
@override
115-
Map<String, dynamic> serializeEvent(AccelerometerEvent event) {
116-
return {
117-
"x": event.x,
118-
"y": event.y,
119-
"z": event.z,
120-
"timestamp": event.timestamp.microsecondsSinceEpoch,
121-
};
122-
}
123-
}
124-
125-
class UserAccelerometerService
126-
extends _SensorStreamService<UserAccelerometerEvent> {
127-
UserAccelerometerService({required super.control});
128-
129-
@override
130-
Stream<UserAccelerometerEvent> sensorStream(Duration samplingPeriod) {
131-
return userAccelerometerEventStream(samplingPeriod: samplingPeriod);
132-
}
133-
134-
@override
135-
Map<String, dynamic> serializeEvent(UserAccelerometerEvent event) {
136-
return {
137-
"x": event.x,
138-
"y": event.y,
139-
"z": event.z,
140-
"timestamp": event.timestamp.microsecondsSinceEpoch,
141-
};
142-
}
143-
}
144-
145-
class GyroscopeService extends _SensorStreamService<GyroscopeEvent> {
146-
GyroscopeService({required super.control});
147-
148-
@override
149-
Stream<GyroscopeEvent> sensorStream(Duration samplingPeriod) {
150-
return gyroscopeEventStream(samplingPeriod: samplingPeriod);
151-
}
152-
153-
@override
154-
Map<String, dynamic> serializeEvent(GyroscopeEvent event) {
155-
return {
156-
"x": event.x,
157-
"y": event.y,
158-
"z": event.z,
159-
"timestamp": event.timestamp.microsecondsSinceEpoch,
160-
};
161-
}
162-
}
163-
164-
class MagnetometerService extends _SensorStreamService<MagnetometerEvent> {
165-
MagnetometerService({required super.control});
166-
167-
@override
168-
Stream<MagnetometerEvent> sensorStream(Duration samplingPeriod) {
169-
return magnetometerEventStream(samplingPeriod: samplingPeriod);
170-
}
171-
172-
@override
173-
Map<String, dynamic> serializeEvent(MagnetometerEvent event) {
174-
return {
175-
"x": event.x,
176-
"y": event.y,
177-
"z": event.z,
178-
"timestamp": event.timestamp.microsecondsSinceEpoch,
179-
};
180-
}
181-
}
182-
183-
class BarometerService extends _SensorStreamService<BarometerEvent> {
184-
BarometerService({required super.control});
185-
186-
@override
187-
Stream<BarometerEvent> sensorStream(Duration samplingPeriod) {
188-
return barometerEventStream(samplingPeriod: samplingPeriod);
189-
}
190-
191-
@override
192-
Map<String, dynamic> serializeEvent(BarometerEvent event) {
193-
return {
194-
"pressure": event.pressure,
195-
"timestamp": event.timestamp.microsecondsSinceEpoch,
196-
};
197-
}
198-
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:sensors_plus/sensors_plus.dart';
2+
3+
import 'base_sensor.dart';
4+
5+
class GyroscopeService extends BaseSensorService<GyroscopeEvent> {
6+
GyroscopeService({required super.control});
7+
8+
@override
9+
Stream<GyroscopeEvent> sensorStream(Duration samplingPeriod) {
10+
return gyroscopeEventStream(samplingPeriod: samplingPeriod);
11+
}
12+
13+
@override
14+
Map<String, dynamic> serializeEvent(GyroscopeEvent event) {
15+
return {
16+
"x": event.x,
17+
"y": event.y,
18+
"z": event.z,
19+
"timestamp": event.timestamp,
20+
};
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:sensors_plus/sensors_plus.dart';
2+
3+
import 'base_sensor.dart';
4+
5+
class MagnetometerService extends BaseSensorService<MagnetometerEvent> {
6+
MagnetometerService({required super.control});
7+
8+
@override
9+
Stream<MagnetometerEvent> sensorStream(Duration samplingPeriod) {
10+
return magnetometerEventStream(samplingPeriod: samplingPeriod);
11+
}
12+
13+
@override
14+
Map<String, dynamic> serializeEvent(MagnetometerEvent event) {
15+
return {
16+
"x": event.x,
17+
"y": event.y,
18+
"z": event.z,
19+
"timestamp": event.timestamp,
20+
};
21+
}
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:sensors_plus/sensors_plus.dart';
2+
3+
import 'base_sensor.dart';
4+
5+
class UserAccelerometerService
6+
extends BaseSensorService<UserAccelerometerEvent> {
7+
UserAccelerometerService({required super.control});
8+
9+
@override
10+
Stream<UserAccelerometerEvent> sensorStream(Duration samplingPeriod) {
11+
return userAccelerometerEventStream(samplingPeriod: samplingPeriod);
12+
}
13+
14+
@override
15+
Map<String, dynamic> serializeEvent(UserAccelerometerEvent event) {
16+
return {
17+
"x": event.x,
18+
"y": event.y,
19+
"z": event.z,
20+
"timestamp": event.timestamp.microsecondsSinceEpoch,
21+
};
22+
}
23+
}

sdk/python/packages/flet/src/flet/__init__.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,11 @@
414414
ScrollDirection,
415415
ScrollType,
416416
)
417-
from flet.controls.services.accelerometer import Accelerometer
418-
from flet.controls.services.barometer import Barometer
417+
from flet.controls.services.accelerometer import (
418+
Accelerometer,
419+
AccelerometerReadingEvent,
420+
)
421+
from flet.controls.services.barometer import Barometer, BarometerReadingEvent
419422
from flet.controls.services.battery import (
420423
Battery,
421424
BatteryState,
@@ -435,22 +438,15 @@
435438
FilePickerUploadEvent,
436439
FilePickerUploadFile,
437440
)
438-
from flet.controls.services.gyroscope import Gyroscope
441+
from flet.controls.services.gyroscope import Gyroscope, GyroscopeReadingEvent
439442
from flet.controls.services.haptic_feedback import HapticFeedback
440-
from flet.controls.services.magnetometer import Magnetometer
443+
from flet.controls.services.magnetometer import Magnetometer, MagnetometerReadingEvent
441444
from flet.controls.services.screen_brightness import (
442445
ScreenBrightness,
443446
ScreenBrightnessChangeEvent,
444447
)
445448
from flet.controls.services.semantics_service import Assertiveness, SemanticsService
446-
from flet.controls.services.sensor_events import (
447-
AccelerometerReadingEvent,
448-
BarometerReadingEvent,
449-
GyroscopeReadingEvent,
450-
MagnetometerReadingEvent,
451-
SensorErrorEvent,
452-
UserAccelerometerReadingEvent,
453-
)
449+
from flet.controls.services.sensor_error_event import SensorErrorEvent
454450
from flet.controls.services.service import Service
455451
from flet.controls.services.shake_detector import ShakeDetector
456452
from flet.controls.services.share import (
@@ -468,7 +464,10 @@
468464
UrlLauncher,
469465
WebViewConfiguration,
470466
)
471-
from flet.controls.services.user_accelerometer import UserAccelerometer
467+
from flet.controls.services.user_accelerometer import (
468+
UserAccelerometer,
469+
UserAccelerometerReadingEvent,
470+
)
472471
from flet.controls.services.wakelock import Wakelock
473472
from flet.controls.template_route import TemplateRoute
474473
from flet.controls.text_style import (

sdk/python/packages/flet/src/flet/controls/services/accelerometer.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
1+
from dataclasses import dataclass
2+
from datetime import datetime
13
from typing import Optional
24

35
from flet.controls.base_control import control
4-
from flet.controls.control_event import EventHandler
6+
from flet.controls.control_event import Event, EventHandler
57
from flet.controls.duration import Duration
6-
from flet.controls.services.sensor_events import (
7-
AccelerometerReadingEvent,
8-
SensorErrorEvent,
9-
)
8+
from flet.controls.services.sensor_error_event import SensorErrorEvent
109
from flet.controls.services.service import Service
1110

12-
__all__ = ["Accelerometer"]
11+
__all__ = ["Accelerometer", "AccelerometerReadingEvent"]
12+
13+
14+
@dataclass(kw_only=True)
15+
class AccelerometerReadingEvent(Event["Accelerometer"]):
16+
"""
17+
Discrete reading from an accelerometer. Accelerometers measure the velocity
18+
of the device. Note that these readings include the effects of gravity.
19+
Put simply, you can use accelerometer readings to tell if the device
20+
is moving in a particular direction.
21+
"""
22+
23+
x: float
24+
"""Acceleration along the X axis, in `m/s^2`."""
25+
26+
y: float
27+
"""Acceleration along the Y axis, in `m/s^2`."""
28+
29+
z: float
30+
"""Acceleration along the Z axis, in `m/s^2`."""
31+
32+
timestamp: datetime
33+
"""Event timestamp."""
1334

1435

1536
@control("Accelerometer")

sdk/python/packages/flet/src/flet/controls/services/barometer.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
1+
from dataclasses import dataclass
2+
from datetime import datetime
13
from typing import Optional
24

35
from flet.controls.base_control import control
4-
from flet.controls.control_event import EventHandler
6+
from flet.controls.control_event import Event, EventHandler
57
from flet.controls.duration import Duration
6-
from flet.controls.services.sensor_events import (
7-
BarometerReadingEvent,
8-
SensorErrorEvent,
9-
)
8+
from flet.controls.services.sensor_error_event import SensorErrorEvent
109
from flet.controls.services.service import Service
1110

12-
__all__ = ["Barometer"]
11+
__all__ = ["Barometer", "BarometerReadingEvent"]
12+
13+
14+
@dataclass(kw_only=True)
15+
class BarometerReadingEvent(Event["Barometer"]):
16+
"""
17+
A sensor sample from a barometer.
18+
19+
Barometers measure the atmospheric pressure surrounding the sensor,
20+
returning values in hectopascals `hPa`.
21+
22+
Consider that these samples may be affected by altitude and weather conditions,
23+
and can be used to predict short-term weather changes or determine altitude.
24+
25+
Note that water-resistant phones or similar sealed devices may experience
26+
pressure fluctuations as the device is held or used, due to changes
27+
in pressure caused by handling the device.
28+
29+
An altimeter is an example of a general utility for barometer data.
30+
"""
31+
32+
pressure: float
33+
"""Atmospheric pressure reading, in hectopascals (`hPa`)."""
34+
35+
timestamp: datetime
36+
"""Event timestamp."""
1337

1438

1539
@control("Barometer")

0 commit comments

Comments
 (0)