DEV Community

Discussion on: Flutter WiFi Direct Plugin

Collapse
 
hrihtik profile image
Hrithik-S

THIS IS MY CODE:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter_p2p/flutter_p2p.dart';
import 'package:flutter_p2p/gen/protos/protos.pb.dart';

class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}

class _HomePageState extends State with WidgetsBindingObserver {
@override
void initState() {
super.initState();
_register();
WidgetsBinding.instance.addObserver(this);
}

@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_register();
} else if (state == AppLifecycleState.paused) {
_unregister();
}
}

List devices = [];

var _isConnected = false;
var _isHost = false;

List _subscriptions = [];

void _register() async {
if (!await _checkPermission()) {
return;
}
_subscriptions.add(FlutterP2p.wifiEvents.stateChange.listen((change) {
print("stateChange: ${change.isEnabled}");
}));

_subscriptions.add(FlutterP2p.wifiEvents.connectionChange.listen((change) {
  setState(() {
    _isConnected = change.networkInfo.isConnected;
    _isHost = change.wifiP2pInfo.isGroupOwner;
    _deviceAddress = change.wifiP2pInfo.groupOwnerAddress;
  });
  print(
      "connectionChange: ${change.wifiP2pInfo.isGroupOwner}, Connected: ${change.networkInfo.isConnected}");
}));

_subscriptions.add(FlutterP2p.wifiEvents.thisDeviceChange.listen((change) {
  print(
      "deviceChange: ${change.deviceName} / ${change.deviceAddress} / ${change.primaryDeviceType} / ${change.secondaryDeviceType} ${change.isGroupOwner ? 'GO' : '-GO'}");
}));

_subscriptions.add(FlutterP2p.wifiEvents.discoveryChange.listen((change) {
  print("discoveryStateChange: ${change.isDiscovering}");
}));

_subscriptions.add(FlutterP2p.wifiEvents.peersChange.listen((change) {
  print("peersChange: ${change.devices.length}");
  change.devices.forEach((device) {
    print("device: ${device.deviceName} / ${device.deviceAddress}");
  });

  setState(() {
    devices = change.devices;
  });
}));

FlutterP2p.register();
Enter fullscreen mode Exit fullscreen mode

}

void _unregister() {
_subscriptions.forEach((subscription) => subscription.cancel());
FlutterP2p.unregister();
}

P2pSocket _socket;
void _openPortAndAccept(int port) async {
var socket = await FlutterP2p.openHostPort(port);
setState(() {
_socket = socket;
});

var buffer = "";
socket.inputStream.listen((data) {
  var msg = String.fromCharCodes(data.data);
  buffer += msg;
  if (data.dataAvailable == 0) {
    snackBar("Data Received: $buffer");
    socket.writeString("Successfully received: $buffer");
    buffer = "";
  }
});

print("_openPort done");

await FlutterP2p.acceptPort(port);
print("_accept done");
Enter fullscreen mode Exit fullscreen mode

}

var _deviceAddress = "";

_connectToPort(int port) async {
var socket = await FlutterP2p.connectToHost(
_deviceAddress,
port,
timeout: 100000,
);

setState(() {
  _socket = socket;
});

_socket.inputStream.listen((data) {
  var msg = utf8.decode(data.data);
  snackBar("Received from Host: $msg");
});

print("_connectToPort done");
Enter fullscreen mode Exit fullscreen mode

}

Future _checkPermission() async {
if (!await FlutterP2p.isLocationPermissionGranted()) {
await FlutterP2p.requestLocationPermission();
return false;
}
return true;
}

final _scaffoldKey = GlobalKey();

@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: const Text('Plugin example app 2'),
),
body: Column(
children: [
Text(_isConnected
? "Connected: ${_isHost ? "Host" : "Client"}"
: "Disconnected"),
RaisedButton(
onPressed: () => FlutterP2p.discoverDevices(),
child: Text("Discover Devices"),
),
RaisedButton(
onPressed:
_isConnected && _isHost ? () => _openPortAndAccept(8888) : null,
child: Text("Open and accept data from port 8888"),
),
RaisedButton(
onPressed: _isConnected ? () => _connectToPort(8888) : null,
child: Text("Connect to port 8888"),
),
RaisedButton(
onPressed: _socket != null
? () => _socket.writeString("Hello World")
: null,
child: Text("Send hello world"),
),
RaisedButton(
onPressed: _isConnected ? () => FlutterP2p.removeGroup() : null,
child: Text("Disconnect"),
),
Expanded(
child: ListView(
children: this.devices.map((d) {
return ListTile(
title: Text(d.deviceName),
subtitle: Text(d.deviceAddress),
onTap: () {
print(
"${_isConnected ? "Disconnect" : "Connect"} to device: $_deviceAddress");
return _isConnected
? FlutterP2p.cancelConnect(d)
: FlutterP2p.connect(d);
},
);
}).toList(),
),
),
],
),
);
}

snackBar(String text) {
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text(text),
duration: Duration(seconds: 2),
),
);
}
}

ERROR OCCURED TO ME:

A problem occurred configuring project ':flutter_p2p'.

Could not resolve all artifacts for configuration ':flutter_p2p:classpath'.
Could not download kotlin-compiler-embeddable.jar (org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.71)
> Could not get resource 'jcenter.bintray.com/org/jetbrains/...'.
> Premature end of Content-Length delimited message body (expected: 29106171; received: 27524912
Could not get unknown property 'android' for project ':flutter_p2p' of type org.gradle.api.Project.