diff --git a/CHANGELOG.md b/CHANGELOG.md index 97cbb7a..1e28e98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [4.0.0] + +Bump `package:connectivity_plus` to `^6.0.3` +Bump `package:network_info_plus` to `^5.0.3` + ## [3.0.1] Bump `package:connectivity_plus` to `^5.0.1` diff --git a/README.md b/README.md index fb41abb..553b3b9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A tidy utility to handle offline/online connectivity like a Boss. It provides su ```yaml dependencies: - flutter_offline: "^3.0.1" + flutter_offline: "^4.0.0" ``` ### ⚡️ Import @@ -39,10 +39,10 @@ class DemoPage extends StatelessWidget { body: OfflineBuilder( connectivityBuilder: ( BuildContext context, - ConnectivityResult connectivity, + List connectivity, Widget child, ) { - final bool connected = connectivity != ConnectivityResult.none; + final bool connected = !connectivity.contains(ConnectivityResult.none); return new Stack( fit: StackFit.expand, children: [ diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 493156e..9ae4a03 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -46,7 +46,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.example" - minSdkVersion 19 + minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml index c208884..f880684 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 6d735fa..e7038ac 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml index c208884..f880684 100644 --- a/example/android/app/src/profile/AndroidManifest.xml +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/example/android/build.gradle b/example/android/build.gradle index fb589d2..5d03ccf 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.5.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 94adc3a..b9a9a24 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,3 +1,6 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index cfe88f6..7aeeb11 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/example/lib/widgets/demo_1.dart b/example/lib/widgets/demo_1.dart index dd432a4..f715aaf 100644 --- a/example/lib/widgets/demo_1.dart +++ b/example/lib/widgets/demo_1.dart @@ -9,10 +9,10 @@ class Demo1 extends StatelessWidget { return OfflineBuilder( connectivityBuilder: ( BuildContext context, - ConnectivityResult connectivity, + List connectivity, Widget child, ) { - final connected = connectivity != ConnectivityResult.none; + final connected = !connectivity.contains(ConnectivityResult.none); return Stack( fit: StackFit.expand, children: [ diff --git a/example/lib/widgets/demo_2.dart b/example/lib/widgets/demo_2.dart index 81a93fd..955a438 100644 --- a/example/lib/widgets/demo_2.dart +++ b/example/lib/widgets/demo_2.dart @@ -9,10 +9,10 @@ class Demo2 extends StatelessWidget { return OfflineBuilder( connectivityBuilder: ( BuildContext context, - ConnectivityResult connectivity, + List connectivity, Widget child, ) { - if (connectivity == ConnectivityResult.none) { + if (connectivity.contains(ConnectivityResult.none)) { return Container( color: Colors.white, child: const Center( diff --git a/example/lib/widgets/demo_3.dart b/example/lib/widgets/demo_3.dart index 46897ec..225a3d1 100644 --- a/example/lib/widgets/demo_3.dart +++ b/example/lib/widgets/demo_3.dart @@ -10,10 +10,10 @@ class Demo3 extends StatelessWidget { debounceDuration: Duration.zero, connectivityBuilder: ( BuildContext context, - ConnectivityResult connectivity, + List connectivity, Widget child, ) { - if (connectivity == ConnectivityResult.none) { + if (connectivity.contains(ConnectivityResult.none)) { return Container( color: Colors.white70, child: const Center( diff --git a/example/pubspec.lock b/example/pubspec.lock index 617106e..27d5ad4 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: transitive description: name: connectivity_plus - sha256: b502a681ba415272ecc41400bd04fe543ed1a62632137dc84d25a91e7746f55f + sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.3" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "2.0.0" dbus: dependency: transitive description: @@ -108,7 +108,7 @@ packages: path: ".." relative: true source: path - version: "3.0.1" + version: "4.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -119,14 +119,30 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: dependency: transitive description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "3.0.1" lints: dependency: transitive description: @@ -139,42 +155,42 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" network_info_plus: dependency: transitive description: name: network_info_plus - sha256: "5a79c244070fb7f7d10fbcfa24eed315252b4e662f42658029871d31afdbba9e" + sha256: "5bd4b86e28fed5ed4e6ac7764133c031dfb7d3f46aa2a81b46f55038aa78ecc0" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.3" network_info_plus_platform_interface: dependency: transitive description: name: network_info_plus_platform_interface - sha256: "881f5029c5edaf19c616c201d3d8b366c5b1384afd5c1da5a49e4345de82fb8b" + sha256: "2e193d61d3072ac17824638793d3b89c6d581ce90c11604f4ca87311b42f2706" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "2.0.0" nm: dependency: transitive description: @@ -187,10 +203,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" petitparser: dependency: transitive description: @@ -203,10 +219,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.8" sky_engine: dependency: transitive description: flutter @@ -256,10 +272,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" vector_math: dependency: transitive description: @@ -268,6 +284,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" web: dependency: transitive description: @@ -293,5 +317,5 @@ packages: source: hosted version: "6.3.0" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/lib/src/main.dart b/lib/src/main.dart index c21d816..9875690 100644 --- a/lib/src/main.dart +++ b/lib/src/main.dart @@ -12,7 +12,7 @@ typedef ValueWidgetBuilder = Widget Function(BuildContext context, T value, W class OfflineBuilder extends StatefulWidget { factory OfflineBuilder({ Key? key, - required ValueWidgetBuilder connectivityBuilder, + required ValueWidgetBuilder> connectivityBuilder, Duration debounceDuration = kOfflineDebounceDuration, WidgetBuilder? builder, Widget? child, @@ -53,7 +53,7 @@ class OfflineBuilder extends StatefulWidget { final Duration debounceDuration; /// Used for building the Offline and/or Online UI - final ValueWidgetBuilder connectivityBuilder; + final ValueWidgetBuilder> connectivityBuilder; /// Used for building the child widget final WidgetBuilder? builder; @@ -69,7 +69,7 @@ class OfflineBuilder extends StatefulWidget { } class OfflineBuilderState extends State { - late Stream _connectivityStream; + late Stream> _connectivityStream; @override void initState() { @@ -82,9 +82,9 @@ class OfflineBuilderState extends State { @override Widget build(BuildContext context) { - return StreamBuilder( + return StreamBuilder>( stream: _connectivityStream, - builder: (BuildContext context, AsyncSnapshot snapshot) { + builder: (BuildContext context, AsyncSnapshot> snapshot) { if (!snapshot.hasData && !snapshot.hasError) { return const SizedBox(); } diff --git a/lib/src/utils.dart b/lib/src/utils.dart index fe5382a..b1e7d3d 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -2,14 +2,14 @@ import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; -StreamTransformer debounce( +StreamTransformer, List> debounce( Duration debounceDuration, ) { var seenFirstData = false; Timer? debounceTimer; - return StreamTransformer.fromHandlers( - handleData: (ConnectivityResult data, EventSink sink) { + return StreamTransformer, List>.fromHandlers( + handleData: (List data, EventSink> sink) { if (seenFirstData) { debounceTimer?.cancel(); debounceTimer = Timer(debounceDuration, () => sink.add(data)); @@ -18,25 +18,25 @@ StreamTransformer debounce( seenFirstData = true; } }, - handleDone: (EventSink sink) { + handleDone: (EventSink> sink) { debounceTimer?.cancel(); sink.close(); }, ); } -StreamTransformer startsWith( - ConnectivityResult data, +StreamTransformer, List> startsWith( + List data, ) { - return StreamTransformer( + return StreamTransformer, List>( ( - Stream input, + Stream> input, bool cancelOnError, ) { - StreamController? controller; - late StreamSubscription subscription; + StreamController>? controller; + late StreamSubscription> subscription; - controller = StreamController( + controller = StreamController>( sync: true, onListen: () => controller?.add(data), onPause: ([Future? resumeSignal]) => subscription.pause(resumeSignal), diff --git a/pubspec.lock b/pubspec.lock index d5507b7..ae79dc5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: b502a681ba415272ecc41400bd04fe543ed1a62632137dc84d25a91e7746f55f + sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.3" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "2.0.0" dbus: dependency: transitive description: @@ -112,14 +112,30 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + leak_tracker: dependency: transitive description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -132,42 +148,42 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" network_info_plus: dependency: "direct main" description: name: network_info_plus - sha256: "5a79c244070fb7f7d10fbcfa24eed315252b4e662f42658029871d31afdbba9e" + sha256: "5bd4b86e28fed5ed4e6ac7764133c031dfb7d3f46aa2a81b46f55038aa78ecc0" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.3" network_info_plus_platform_interface: dependency: transitive description: name: network_info_plus_platform_interface - sha256: "881f5029c5edaf19c616c201d3d8b366c5b1384afd5c1da5a49e4345de82fb8b" + sha256: "2e193d61d3072ac17824638793d3b89c6d581ce90c11604f4ca87311b42f2706" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "2.0.0" nm: dependency: transitive description: @@ -180,10 +196,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" petitparser: dependency: transitive description: @@ -249,10 +265,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" vector_math: dependency: transitive description: @@ -261,6 +277,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" web: dependency: transitive description: @@ -286,5 +310,5 @@ packages: source: hosted version: "6.3.0" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index e546b68..57f5e39 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_offline description: A tidy utility to handle offline/online connectivity like a Boss. -version: 3.0.1 +version: 4.0.0 homepage: https://github.com/jogboms/flutter_offline environment: @@ -10,8 +10,8 @@ environment: dependencies: flutter: sdk: flutter - connectivity_plus: ^5.0.1 - network_info_plus: ^4.0.1 + connectivity_plus: ^6.0.3 + network_info_plus: ^5.0.3 dev_dependencies: flutter_lints: ^2.0.2 diff --git a/test/flutter_offline_test.dart b/test/flutter_offline_test.dart index 6efe606..0cc39a3 100644 --- a/test/flutter_offline_test.dart +++ b/test/flutter_offline_test.dart @@ -20,7 +20,7 @@ void main() { testWidgets('Test w/ builder param', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.none), + connectivityService: TestConnectivityService([ConnectivityResult.none]), wifiInfo: TestNetworkInfoService(), connectivityBuilder: (_, __, Widget child) => child, builder: (BuildContext context) => const Text('builder_result'), @@ -33,7 +33,7 @@ void main() { testWidgets('Test w/ child param', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.none), + connectivityService: TestConnectivityService([ConnectivityResult.none]), wifiInfo: TestNetworkInfoService(), connectivityBuilder: (_, __, Widget child) => child, child: const Text('child_result'), @@ -48,7 +48,7 @@ void main() { testWidgets('Test builder & child param', (WidgetTester tester) async { expect(() { OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.none), + connectivityService: TestConnectivityService([ConnectivityResult.none]), wifiInfo: TestNetworkInfoService(), connectivityBuilder: (_, __, Widget child) => child, builder: (BuildContext context) => const Text('builder_result'), @@ -60,7 +60,7 @@ void main() { testWidgets('Test no builder & child param', (WidgetTester tester) async { expect(() { OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.none), + connectivityService: TestConnectivityService([ConnectivityResult.none]), wifiInfo: TestNetworkInfoService(), connectivityBuilder: (_, __, Widget child) => child, ); @@ -70,144 +70,167 @@ void main() { group('Test Status', () { testWidgets('Test builder offline', (WidgetTester tester) async { + const initialConnection = [ConnectivityResult.none]; await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.none), + connectivityService: TestConnectivityService(initialConnection), wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), child: const SizedBox(), ), )); await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.none'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); }); testWidgets('Test builder online', (WidgetTester tester) async { + const initialConnection = [ConnectivityResult.wifi]; await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( - connectivityService: TestConnectivityService(ConnectivityResult.mobile), + connectivityService: TestConnectivityService(initialConnection), wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), child: const SizedBox(), ), )); await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.mobile'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); }); }); group('Test Flipper', () { testWidgets('Test builder flips online to offline', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.mobile); + const initialConnection = [ConnectivityResult.wifi]; + const lastConnection = [ConnectivityResult.none]; + final service = TestConnectivityService(initialConnection); await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), child: const SizedBox(), ), )); await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.mobile'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); - service.result = ConnectivityResult.none; + service.result = [ConnectivityResult.none]; await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.none'), findsOneWidget); + expect(find.text(lastConnection.toString()), findsOneWidget); }); testWidgets('Test builder flips offline to online', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.none); + const initialConnection = [ConnectivityResult.none]; + const lastConnection = [ConnectivityResult.wifi]; + final service = TestConnectivityService(initialConnection); await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), child: const SizedBox(), ), )); await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.none'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); - service.result = ConnectivityResult.wifi; + service.result = [ConnectivityResult.wifi]; await tester.pump(kOfflineDebounceDuration); - expect(find.text('ConnectivityResult.wifi'), findsOneWidget); + expect(find.text(lastConnection.toString()), findsOneWidget); }); }); group('Test Debounce', () { + const initialConnection = [ConnectivityResult.none]; + const connections = [ + [ConnectivityResult.wifi], + [ConnectivityResult.mobile], + [ConnectivityResult.none], + [ConnectivityResult.wifi], + ]; testWidgets('Test for Debounce: Zero', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.none); + final service = TestConnectivityService(initialConnection); const debounceDuration = Duration.zero; await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), debounceDuration: debounceDuration, - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), child: const SizedBox(), ), )); - service.result = ConnectivityResult.wifi; - await tester.pump(debounceDuration); - expect(find.text('ConnectivityResult.wifi'), findsOneWidget); - service.result = ConnectivityResult.mobile; - await tester.pump(debounceDuration); - expect(find.text('ConnectivityResult.mobile'), findsOneWidget); - service.result = ConnectivityResult.none; - await tester.pump(debounceDuration); - expect(find.text('ConnectivityResult.none'), findsOneWidget); - service.result = ConnectivityResult.wifi; - await tester.pump(debounceDuration); - expect(find.text('ConnectivityResult.wifi'), findsOneWidget); + for (final connection in connections) { + service.result = connection; + await tester.pump(debounceDuration); + expect(find.text(connection.toString()), findsOneWidget); + } }); testWidgets('Test for Debounce: 5 seconds', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.none); const debounceDuration = Duration(seconds: 5); + + const initialConnection = [ConnectivityResult.none]; + const actualConnections = [ + [ConnectivityResult.wifi], + [ConnectivityResult.mobile], + [ConnectivityResult.none], + [ConnectivityResult.wifi], + ]; + const expectedConnections = [ + [ConnectivityResult.none], + [ConnectivityResult.none], + [ConnectivityResult.none], + [ConnectivityResult.wifi], + ]; + const durations = [ + Duration.zero, + Duration.zero, + Duration.zero, + debounceDuration, + ]; + + final service = TestConnectivityService(initialConnection); await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), debounceDuration: debounceDuration, - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) { + return Text('$connectivity'); + }, child: const SizedBox(), ), )); - service.result = ConnectivityResult.wifi; - await tester.pump(Duration.zero); - expect(find.text('ConnectivityResult.none'), findsOneWidget); - service.result = ConnectivityResult.mobile; - await tester.pump(Duration.zero); - expect(find.text('ConnectivityResult.none'), findsOneWidget); - service.result = ConnectivityResult.none; - await tester.pump(Duration.zero); - expect(find.text('ConnectivityResult.none'), findsOneWidget); - service.result = ConnectivityResult.wifi; - await tester.pump(debounceDuration); - expect(find.text('ConnectivityResult.wifi'), findsOneWidget); + for (var i = 0; i < actualConnections.length; i++) { + service.result = actualConnections[i]; + await tester.pump(durations[i]); + expect(find.text(expectedConnections[i].toString()), findsOneWidget); + } }); }); group('Test Platform Errors', () { testWidgets('Test w/o errorBuilder', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.none); + const initialConnection = [ConnectivityResult.none]; + final service = TestConnectivityService(initialConnection); await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), debounceDuration: Duration.zero, child: const SizedBox(), ), )); await tester.pump(Duration.zero); - expect(find.text('ConnectivityResult.none'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); service.addError(); await tester.pump(kOfflineDebounceDuration); @@ -215,13 +238,14 @@ void main() { }); testWidgets('Test w/ errorBuilder', (WidgetTester tester) async { - final service = TestConnectivityService(ConnectivityResult.wifi); + const initialConnection = [ConnectivityResult.wifi]; + final service = TestConnectivityService(initialConnection); await tester.pumpWidget(MaterialApp( home: OfflineBuilder.initialize( connectivityService: service, wifiInfo: TestNetworkInfoService(), - connectivityBuilder: (_, ConnectivityResult connectivity, __) => Text('$connectivity'), + connectivityBuilder: (_, List connectivity, __) => Text('$connectivity'), debounceDuration: Duration.zero, errorBuilder: (context) => const Text('Error'), child: const SizedBox(), @@ -229,7 +253,7 @@ void main() { )); await tester.pump(Duration.zero); - expect(find.text('ConnectivityResult.wifi'), findsOneWidget); + expect(find.text(initialConnection.toString()), findsOneWidget); service.addError(); await tester.pump(kOfflineDebounceDuration); @@ -239,18 +263,18 @@ void main() { } class TestConnectivityService implements Connectivity { - TestConnectivityService([this.initialConnection]) : _result = initialConnection ?? ConnectivityResult.none { - controller = StreamController.broadcast( + TestConnectivityService([this.initialConnection]) : _result = initialConnection ?? [ConnectivityResult.none] { + controller = StreamController>.broadcast( onListen: () => controller.add(_result), ); } - late final StreamController controller; - final ConnectivityResult? initialConnection; + late final StreamController> controller; + final List? initialConnection; - ConnectivityResult _result; + List _result; - set result(ConnectivityResult result) { + set result(List result) { _result = result; controller.add(result); } @@ -258,10 +282,10 @@ class TestConnectivityService implements Connectivity { void addError() => controller.addError('Error'); @override - Stream get onConnectivityChanged => controller.stream; + Stream> get onConnectivityChanged => controller.stream; @override - Future checkConnectivity() { + Future> checkConnectivity() { return Future.delayed(Duration.zero, () => initialConnection!); } } @@ -275,18 +299,9 @@ class TestNetworkInfoService implements wifi.NetworkInfo { @override Future getWifiName() async => 'Localhost'; - @override - Future getLocationServiceAuthorization() async => - wifi.LocationAuthorizationStatus.authorizedAlways; - @override Future getWifiBSSID() async => ''; - @override - Future requestLocationServiceAuthorization( - {bool requestAlwaysLocationUsage = false}) => - getLocationServiceAuthorization(); - @override Future getWifiBroadcast() async => '127.0.0.255'; diff --git a/test/utils_debounce_test.dart b/test/utils_debounce_test.dart index f4d332b..97d5912 100644 --- a/test/utils_debounce_test.dart +++ b/test/utils_debounce_test.dart @@ -12,10 +12,10 @@ Future waitForTimer(int milliseconds) => Future(() { ); void main() { - StreamController stream() => StreamController.broadcast(); + StreamController> stream() => StreamController>.broadcast(); group('Group', () { - late StreamController values; + late StreamController> values; late List emittedValues; late bool valuesCanceled; late bool isDone; @@ -29,10 +29,10 @@ void main() { ..onCancel = () { valuesCanceled = true; }; - emittedValues = []; - errors = []; + emittedValues = >[]; + errors = >[]; isDone = false; - transformed = values.stream.transform(transformer as StreamTransformer); + transformed = values.stream.transform(transformer as StreamTransformer, void>); subscription = transformed.listen(emittedValues.add, onError: errors.add, onDone: () { isDone = true; }); @@ -49,26 +49,26 @@ void main() { }); test('swallows values that come faster than duration', () async { - values.add(ConnectivityResult.mobile); - values.add(ConnectivityResult.wifi); + values.add([ConnectivityResult.mobile]); + values.add([ConnectivityResult.wifi]); await values.close(); await waitForTimer(5); - expect(emittedValues, [ConnectivityResult.mobile]); + expect(emittedValues, [[ConnectivityResult.mobile]]); }); test('outputs multiple values spaced further than duration', () async { - values.add(ConnectivityResult.mobile); + values.add([ConnectivityResult.mobile]); await waitForTimer(5); - values.add(ConnectivityResult.wifi); + values.add([ConnectivityResult.wifi]); await waitForTimer(5); expect( emittedValues, - [ConnectivityResult.mobile, ConnectivityResult.wifi], + [[ConnectivityResult.mobile], [ConnectivityResult.wifi]], ); }); test('waits for pending value to close', () async { - values.add(ConnectivityResult.mobile); + values.add([ConnectivityResult.mobile]); await waitForTimer(5); await values.close(); await Future(() {}); diff --git a/test/utils_starts_with_test.dart b/test/utils_starts_with_test.dart index c42eb3f..42359f5 100644 --- a/test/utils_starts_with_test.dart +++ b/test/utils_starts_with_test.dart @@ -5,19 +5,19 @@ import 'package:flutter_offline/src/utils.dart' as transformers; import 'package:flutter_test/flutter_test.dart'; void main() { - StreamController stream() => StreamController(); + StreamController> stream() => StreamController>(); - late StreamController values; - late List emittedValues; + late StreamController> values; + late List> emittedValues; late bool valuesCanceled; late bool valuesPaused; late bool valuesResume; - late StreamSubscription subscription; + late StreamSubscription> subscription; // bool isDone; late List errors; void setupForStreamType(StreamTransformer transformer) { - emittedValues = []; + emittedValues = >[]; valuesCanceled = false; errors = []; // isDone = false; @@ -32,7 +32,7 @@ void main() { valuesCanceled = true; }; subscription = values.stream - .transform(transformer as StreamTransformer) + .transform>(transformer as StreamTransformer, List>) .listen(emittedValues.add, onError: errors.add, onDone: () { // isDone = true; }); @@ -40,7 +40,7 @@ void main() { group('startWith', () { setUp(() { - setupForStreamType(transformers.startsWith(ConnectivityResult.none)); + setupForStreamType(transformers.startsWith([ConnectivityResult.none])); }); test('cancels values', () async { @@ -63,20 +63,20 @@ void main() { test('outputs initial value', () async { await Future(() {}); - expect(emittedValues, [ConnectivityResult.none]); + expect(emittedValues, [[ConnectivityResult.none]]); }); test('outputs all values', () async { values - ..add(ConnectivityResult.mobile) - ..add(ConnectivityResult.wifi); + ..add([ConnectivityResult.mobile]) + ..add([ConnectivityResult.wifi]); await Future(() {}); - expect(emittedValues, [ConnectivityResult.none, ConnectivityResult.mobile, ConnectivityResult.wifi]); + expect(emittedValues, [[ConnectivityResult.none], [ConnectivityResult.mobile], [ConnectivityResult.wifi]]); }); test('outputs initial when followed by empty stream', () async { await values.close(); - expect(emittedValues, [ConnectivityResult.none]); + expect(emittedValues, [[ConnectivityResult.none]]); }); // test('closes with values', () async {