-
-
Notifications
You must be signed in to change notification settings - Fork 211
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;
}
},
);
}
}