Add macOS support (#23)

* Add macOS support

* Update README

* Update to v0.2.0

* Document breaking changes

* Delete widget tests
This commit is contained in:
Ben Hagen
2025-05-13 16:24:58 +02:00
committed by GitHub
parent c391cc5f26
commit abe519dae7
103 changed files with 3444 additions and 169 deletions
@@ -1,13 +1,13 @@
import 'package:flutter/material.dart';
class IOSRoleSelector extends StatelessWidget {
const IOSRoleSelector({
class DarwinRoleSelector extends StatelessWidget {
const DarwinRoleSelector({
super.key,
required this.isIosBrowser,
required this.isDarwinBrowser,
required this.onSelect,
});
final bool isIosBrowser;
final bool isDarwinBrowser;
final ValueChanged<bool> onSelect;
@override
@@ -17,11 +17,11 @@ class IOSRoleSelector extends StatelessWidget {
children: [
Center(
child: Text(
'You are ${isIosBrowser ? 'Browser' : 'Advertiser'}',
'You are ${isDarwinBrowser ? 'Browser' : 'Advertiser'}',
),
),
Switch(
value: isIosBrowser,
value: isDarwinBrowser,
onChanged: onSelect,
),
],
+3 -3
View File
@@ -5,13 +5,13 @@ class PeerWidget extends StatelessWidget {
const PeerWidget({
super.key,
required this.device,
required this.isIosBrowser,
required this.isDarwinBrowser,
required this.onConnect,
required this.communicationChannelState,
});
final NearbyDevice device;
final bool isIosBrowser;
final bool isDarwinBrowser;
final ValueChanged<NearbyDevice> onConnect;
final CommunicationChannelState communicationChannelState;
@@ -28,7 +28,7 @@ class PeerWidget extends StatelessWidget {
return ListTile(
title: Text(
'${isIosBrowser ? 'Found device' : 'Pending invitation'} | ${device.info.displayName} | $status',
'${isDarwinBrowser ? 'Found device' : 'Pending invitation'} | ${device.info.displayName} | $status',
),
onTap: canTap ? () => onConnect(device) : null,
tileColor: Colors.blueAccent,
+12 -12
View File
@@ -10,7 +10,7 @@ import 'package:nearby_service/nearby_service.dart';
/// see https://github.com/ksenia312/nearby_service/blob/main/example/lib/.
import 'components/connected_device_view.dart';
import 'components/files_messaging_view.dart';
import 'components/ios_role_selector.dart';
import 'components/darwin_role_selector.dart';
import 'components/peer_widget.dart';
import 'components/text_messaging_view.dart';
import 'utils/app_snack_bar.dart';
@@ -64,8 +64,8 @@ class _AppBodyState extends State<AppBody> {
AppState _state = AppState.idle;
/// Browser OR Advertiser for IOS
bool _isIosBrowser = true;
/// Browser OR Advertiser for IOS/MacOS
bool _isDarwinBrowser = true;
/// List of discovered devices
List<NearbyDevice> _peers = [];
@@ -98,10 +98,10 @@ class _AppBodyState extends State<AppBody> {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
if (Platform.isIOS)
IOSRoleSelector(
isIosBrowser: _isIosBrowser,
onSelect: (value) => setState(() => _isIosBrowser = value),
if (Platform.isIOS || Platform.isMacOS)
DarwinRoleSelector(
isDarwinBrowser: _isDarwinBrowser,
onSelect: (value) => setState(() => _isDarwinBrowser = value),
),
ElevatedButton(
onPressed: _startProcess,
@@ -112,13 +112,13 @@ class _AppBodyState extends State<AppBody> {
} else if (_state == AppState.discovering) {
return ListView(
children: [
if (Platform.isIOS)
Text('You are ${_isIosBrowser ? 'Browser' : 'Advertiser'}'),
if (Platform.isIOS || Platform.isMacOS)
Text('You are ${_isDarwinBrowser ? 'Browser' : 'Advertiser'}'),
if (_peers.isEmpty) const Text('Searching for peers...'),
..._peers.map(
(e) => PeerWidget(
device: e,
isIosBrowser: _isIosBrowser,
isDarwinBrowser: _isDarwinBrowser,
onConnect: _connect,
communicationChannelState: _communicationChannelState,
),
@@ -176,8 +176,8 @@ class _AppBodyState extends State<AppBody> {
final isGranted = await _nearbyService.android?.requestPermissions();
final wifiEnabled = await _nearbyService.android?.checkWifiService();
return (isGranted ?? false) && (wifiEnabled ?? false);
} else if (Platform.isIOS) {
_nearbyService.ios?.setIsBrowser(value: _isIosBrowser);
} else if (Platform.isIOS || Platform.isMacOS) {
_nearbyService.darwin?.setIsBrowser(value: _isDarwinBrowser);
return true;
} else {
return false;