-
- Notifications
You must be signed in to change notification settings - Fork 212
Description
New Issue Checklist
- I am not disclosing a vulnerability.
- I am not just asking a question.
- I have searched through existing issues.
- I can reproduce the issue with the latest version of Parse Server and the Parse Flutter SDK.
Issue Description
Starting with parse_server_sdk_flutter 9.0.0
, LiveQuery subscriptions no longer work in applications compiled for Windows.
Among the console output, the only relevant message is:
LiveQueryReconnectingController: ParseConnectivityResult.none
.
Rolling back to version 8.0.0 restores LiveQuery functionality.
Steps to reproduce
- Create a Flutter app using
parse_server_sdk_flutter: 9.0.0
. - Connect it to a running Parse Server instance.
- Run the app on Windows.
- Attempt to subscribe to a LiveQuery.
Actual Outcome
LiveQuery does not connect or receive any updates. The console logs: LiveQueryReconnectingController: ParseConnectivityResult.none
Expected Outcome
LiveQuery should connect successfully and receive updates, as it does with SDK version 8.0.0.
Environment
Parse Flutter SDK
- SDK version:
9.0.0
- Flutter version:
3.32.4
- Dart version:
3.8.1
- Operating system version:
Windows 10
Server
- Parse Server version:
7.5.2
Root Cause
The issue is related to recent changes in Connectivity handling (relevant PR)
and a bug in the connectivity_plus
package (related issue).
On Windows (and, as indicated by the connectivity_plus
issue, also on macOS),
Connectivity().checkConnectivity()
returns ConnectivityResult.ethernet
instead of ConnectivityResult.wifi
.
Previously, parse_server_sdk_flutter
had a fallback condition:
default: return sdk.ParseConnectivityResult.wifi;
which masked this behavior, so the issue did not surface in older versions.
Workaround
Provide a custom implementation of ParseConnectivityProvider
when calling Parse().initialize
, for example:
class CustomParseConnectivityProvider extends ParseConnectivityProvider { @override Future<ParseConnectivityResult> checkConnectivity() async { final List<ConnectivityResult> list = await Connectivity().checkConnectivity(); if ([ConnectivityResult.wifi, ConnectivityResult.ethernet] .any(list.contains)) { return ParseConnectivityResult.wifi; } else if (list.contains(ConnectivityResult.mobile)) { return ParseConnectivityResult.mobile; } else { return ParseConnectivityResult.none; } } @override Stream<ParseConnectivityResult> get connectivityStream { return Connectivity().onConnectivityChanged.map( (List<ConnectivityResult> event) { if ([ConnectivityResult.wifi, ConnectivityResult.ethernet] .any(event.contains)) { return ParseConnectivityResult.wifi; } else if (event.contains(ConnectivityResult.mobile)) { return ParseConnectivityResult.mobile; } else { return ParseConnectivityResult.none; } }, ); } }