To receive notifications for connection changes or device changes (peers discovered etc.) you have
to subscribe to the wifiEvents and register the plugin to the native events.
class_MyAppStateextendsState<MyApp> withWidgetsBindingObserver{
@overridevoidinitState() {
super.initState();
_register();
WidgetsBinding.instance.addObserver(this);
}
@overridevoiddispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@overridevoiddidChangeAppLifecycleState(AppLifecycleState state) {
// Stop handling events when the app doesn't run to prevent battery drainingif (state == AppLifecycleState.resumed) {
_register();
} elseif (state == AppLifecycleState.paused) {
_unregister();
}
}
List<StreamSubscription> _subscriptions = [];
void_register() async {
if (!await_checkPermission()) {
return;
}
_subscriptions.add(FlutterP2p.wifiEvents.stateChange.listen((change) {
// Handle wifi state change
}));
_subscriptions.add(FlutterP2p.wifiEvents.connectionChange.listen((change) {
// Handle changes of the connection
}));
_subscriptions.add(FlutterP2p.wifiEvents.thisDeviceChange.listen((change) {
// Handle changes of this device
}));
_subscriptions.add(FlutterP2p.wifiEvents.peersChange.listen((change) {
// Handle discovered peers
}));
_subscriptions.add(FlutterP2p.wifiEvents.discoveryChange.listen((change) {
// Handle discovery state changes
}));
FlutterP2p.register(); // Register to the native events which are send to the streams above
}
void_unregister() {
_subscriptions.forEach((subscription) => subscription.cancel()); // Cancel subscriptionsFlutterP2p.unregister(); // Unregister from native events
}
}
Discover devices
After you subscribed to the events you only need to call the FlutterP2p.discoverDevices() method.
After you are connected to a device you can transfer data async in both directions (client -> host, host -> client).
On the host:
// Open a port and create a socketP2pSocket _socket;
void_openPortAndAccept(int port) async {
var socket = awaitFlutterP2p.openHostPort(port);
setState(() {
_socket = socket;
});
var buffer = "";
socket.inputStream.listen((data) {
var msg = String.fromCharCodes(data.data);
buffer += msg;
if (data.dataAvailable == 0) {
_showSnackBar("Data Received: $buffer");
buffer = "";
}
});
// Write data to the client using the _socket.write(UInt8List) or `_socket.writeString("Hello")` methodprint("_openPort done");
// accept a connection on the created socketawaitFlutterP2p.acceptPort(port);
print("_accept done");
}
On the client:
// Connect to the port and create a socketP2pSocket _socket;
_connectToPort(int port) async {
var socket = awaitFlutterP2p.connectToHost(
_deviceAddress, // see above `Connect to a device`
port,
timeout: 100000, // timeout in milliseconds (default 500)
);
setState(() {
_socket = socket;
});
var buffer = "";
socket.inputStream.listen((data) {
var msg = String.fromCharCodes(data.data);
buffer += msg;
if (data.dataAvailable == 0) {
_showSnackBar("Received from host: $buffer");
buffer = "";
}
});
// Write data to the host using the _socket.write(UInt8List) or `_socket.writeString("Hello")` methodprint("_connectToPort done");
}