Package selection guidance compiled from public package information, community data, and project usage.
flutter_p2p is a Flutter plugin that enables WiFi Direct connectivity on Android devices using the platform's native WiFi P2P API. It allows apps to discover and connect directly to nearby devices over WiFi without requiring a central access point. This is ideal for peer-to-peer file sharing, real-time communication, or local device collaboration. The plugin provides a straightforward interface for managing connections, scanning for peers, and transferring data. It is specifically designed for Android and does not support iOS or other platforms.
Use cases
Direct device-to-device file transfer
Local multiplayer gaming
Offline data synchronization
IoT device pairing
Real-time sensor data sharing
Key features
Native Android WiFi P2P integration
Device discovery and connection management
Secure peer-to-peer communication
Simple Dart API
Platform-specific implementation
Suitable for
Android-only applications
Local network communication
Low-latency device interaction
Apps needing direct device links
Projects avoiding centralized infrastructure
Considerations
Only works on Android
Requires WiFi P2P permissions
Limited to local network range
No iOS support
Depends on device hardware compatibility
Original README
Original README snapshot from the linked source repository. Visit the repository for the latest content.
flutter_p2p
A Wi-Fi Direct Plugin for Flutter.
This plugin is in alpha and only supports android at the moment.
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");
}