Skip to content

Commit 14a68ef

Browse files
committed
Add connectivity service and documentation
Introduced Connectivity service in both Dart and Python SDKs, enabling connectivity status checks and change notifications. Registered connectivity_plus plugin for macOS and Windows clients, updated dependencies, and added example usage and documentation for the new service.
1 parent 0bde7b8 commit 14a68ef

File tree

16 files changed

+219
-0
lines changed

16 files changed

+219
-0
lines changed

client/macos/Flutter/GeneratedPluginRegistrant.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Foundation
77

88
import audioplayers_darwin
99
import battery_plus
10+
import connectivity_plus
1011
import device_info_plus
1112
import file_picker
1213
import geolocator_apple
@@ -29,6 +30,7 @@ import window_to_front
2930
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
3031
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
3132
BatteryPlusMacosPlugin.register(with: registry.registrar(forPlugin: "BatteryPlusMacosPlugin"))
33+
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
3234
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
3335
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
3436
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))

client/pubspec.lock

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,22 @@ packages:
145145
url: "https://pub.dev"
146146
source: hosted
147147
version: "1.19.1"
148+
connectivity_plus:
149+
dependency: transitive
150+
description:
151+
name: connectivity_plus
152+
sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec
153+
url: "https://pub.dev"
154+
source: hosted
155+
version: "6.1.5"
156+
connectivity_plus_platform_interface:
157+
dependency: transitive
158+
description:
159+
name: connectivity_plus_platform_interface
160+
sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204"
161+
url: "https://pub.dev"
162+
source: hosted
163+
version: "2.0.1"
148164
cross_file:
149165
dependency: transitive
150166
description:
@@ -798,6 +814,14 @@ packages:
798814
url: "https://pub.dev"
799815
source: hosted
800816
version: "1.0.0"
817+
nm:
818+
dependency: transitive
819+
description:
820+
name: nm
821+
sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254"
822+
url: "https://pub.dev"
823+
source: hosted
824+
version: "0.5.0"
801825
package_info_plus:
802826
dependency: "direct main"
803827
description:

client/windows/flutter/generated_plugin_registrant.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <audioplayers_windows/audioplayers_windows_plugin.h>
1010
#include <battery_plus/battery_plus_windows_plugin.h>
11+
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
1112
#include <geolocator_windows/geolocator_windows.h>
1213
#include <media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h>
1314
#include <media_kit_video/media_kit_video_plugin_c_api.h>
@@ -26,6 +27,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
2627
registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
2728
BatteryPlusWindowsPluginRegisterWithRegistrar(
2829
registry->GetRegistrarForPlugin("BatteryPlusWindowsPlugin"));
30+
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
31+
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
2932
GeolocatorWindowsRegisterWithRegistrar(
3033
registry->GetRegistrarForPlugin("GeolocatorWindows"));
3134
MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar(

client/windows/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
list(APPEND FLUTTER_PLUGIN_LIST
66
audioplayers_windows
77
battery_plus
8+
connectivity_plus
89
geolocator_windows
910
media_kit_libs_windows_video
1011
media_kit_video

packages/flet/lib/src/flet_core_extension.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import 'models/control.dart';
109109
import 'services/browser_context_menu.dart';
110110
import 'services/battery.dart';
111111
import 'services/clipboard.dart';
112+
import 'services/connectivity.dart';
112113
import 'services/file_picker.dart';
113114
import 'services/haptic_feedback.dart';
114115
import 'services/semantics_service.dart';
@@ -382,6 +383,8 @@ class FletCoreExtension extends FletExtension {
382383
return BatteryService(control: control);
383384
case "Clipboard":
384385
return ClipboardService(control: control);
386+
case "Connectivity":
387+
return ConnectivityService(control: control);
385388
case "FilePicker":
386389
return FilePickerService(control: control);
387390
case "HapticFeedback":
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import 'dart:async';
2+
3+
import 'package:connectivity_plus/connectivity_plus.dart';
4+
import 'package:flutter/foundation.dart';
5+
6+
import '../flet_service.dart';
7+
import '../utils/numbers.dart';
8+
9+
class ConnectivityService extends FletService {
10+
final Connectivity _connectivity = Connectivity();
11+
StreamSubscription<List<ConnectivityResult>>? _subscription;
12+
13+
ConnectivityService({required super.control});
14+
15+
@override
16+
void init() {
17+
super.init();
18+
debugPrint("ConnectivityService(${control.id}).init");
19+
control.addInvokeMethodListener(_invokeMethod);
20+
_updateListeners();
21+
}
22+
23+
@override
24+
void update() {
25+
_updateListeners();
26+
}
27+
28+
Future<dynamic> _invokeMethod(String name, dynamic args) async {
29+
switch (name) {
30+
case "check_connectivity":
31+
final results = await _connectivity.checkConnectivity();
32+
return results.map((r) => r.name).toList();
33+
default:
34+
throw Exception("Unknown Connectivity method: $name");
35+
}
36+
}
37+
38+
void _updateListeners() {
39+
final listenChange = control.getBool("on_connectivity_change") == true;
40+
if (listenChange && _subscription == null) {
41+
_subscription = _connectivity.onConnectivityChanged.listen(
42+
(List<ConnectivityResult> result) {
43+
control.triggerEvent("connectivity_change",
44+
{"connectivity": result.map((r) => r.name).toList()});
45+
}, onError: (error) {
46+
debugPrint(
47+
"ConnectivityService: error listening to connectivity: $error");
48+
});
49+
} else if (!listenChange && _subscription != null) {
50+
_subscription?.cancel();
51+
_subscription = null;
52+
}
53+
}
54+
55+
@override
56+
void dispose() {
57+
debugPrint("ConnectivityService(${control.id}).dispose()");
58+
control.removeInvokeMethodListener(_invokeMethod);
59+
_subscription?.cancel();
60+
_subscription = null;
61+
super.dispose();
62+
}
63+
}

packages/flet/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies:
2323
sdk: flutter
2424
battery_plus: ^6.2.2
2525
collection: ^1.19.0
26+
connectivity_plus: ^6.1.2
2627
device_info_plus: ^12.1.0
2728
equatable: ^2.0.3
2829
file_picker: ^10.3.3
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import flet as ft
2+
3+
4+
async def main(page: ft.Page):
5+
connectivity = ft.Connectivity()
6+
7+
status = ft.Text()
8+
changes = ft.Text()
9+
10+
async def refresh(_=None):
11+
results = await connectivity.check_connectivity()
12+
status.value = "Current connectivity: " + ", ".join(r.value for r in results)
13+
14+
async def on_change(e: ft.ConnectivityChangeEvent):
15+
changes.value = "Connectivity changed: " + ", ".join(
16+
r.value for r in e.connectivity
17+
)
18+
await refresh()
19+
20+
connectivity.on_connectivity_change = on_change
21+
22+
await refresh()
23+
24+
page.add(
25+
ft.Column(
26+
[
27+
status,
28+
ft.Button("Refresh connectivity", on_click=refresh),
29+
changes,
30+
],
31+
)
32+
)
33+
34+
35+
ft.run(main)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
class_name: flet.Connectivity
3+
examples: ../../examples/controls/connectivity
4+
---
5+
6+
{{ class_summary(class_name) }}
7+
8+
## Examples
9+
10+
```python
11+
--8<-- "{{ examples }}/basic.py"
12+
```
13+
14+
{{ class_members(class_name) }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{ class_all_options("flet.ConnectivityChangeEvent", separate_signature=False) }}

0 commit comments

Comments
 (0)