Skip to content

Commit

Permalink
refactor: ♻️ separate network info logic from page UI
Browse files Browse the repository at this point in the history
and restructure network stats to use the futures directly
lukki15 committed Jan 4, 2025

Verified

This commit was signed with the committer’s verified signature.
1 parent af77ea2 commit 05b56f6
Showing 9 changed files with 194 additions and 153 deletions.
2 changes: 1 addition & 1 deletion lib/pages/main_scaffold.dart
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:forui/forui.dart';
import 'package:provider/provider.dart';

import 'package:network_info_app/pages/network_info/network_info.dart';
import 'package:network_info_app/pages/network_info.dart';
import 'package:network_info_app/pages/network_scan/network_scan.dart';
import 'package:network_info_app/provider/connectivity_notifier.dart';

17 changes: 17 additions & 0 deletions lib/pages/network_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:network_info_app/provider/connectivity_notifier.dart';
import 'package:network_info_app/widget/network_info/connectivity_info_tiles.dart';

class NetworkInfo extends StatelessWidget {
const NetworkInfo({super.key});

@override
Widget build(BuildContext context) {
return Consumer<ConnectivityNotifier>(
builder: (context, myNotifier, child) =>
ConnectivityInfoTiles(conductivities: myNotifier.connectionStatus),
);
}
}
133 changes: 0 additions & 133 deletions lib/pages/network_info/network_stats.dart

This file was deleted.

2 changes: 1 addition & 1 deletion lib/pages/network_scan/device_info.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:forui/forui.dart';
import 'package:network_info_app/pages/network_scan/future_text.dart';
import 'package:network_tools/network_tools.dart';

import 'package:network_info_app/pages/network_scan/port_map.dart';
import 'package:network_info_app/widget/future_text.dart';

class DeviceInfo extends StatelessWidget {
const DeviceInfo({
2 changes: 1 addition & 1 deletion lib/pages/network_scan/network_scan.dart
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ import 'package:network_tools/network_tools.dart';
import 'package:provider/provider.dart';

import 'package:network_info_app/pages/network_scan/device_info.dart';
import 'package:network_info_app/pages/network_scan/future_text.dart';
import 'package:network_info_app/widget/future_text.dart';

class NetworkScan extends StatelessWidget {
const NetworkScan({super.key});
Original file line number Diff line number Diff line change
@@ -5,21 +5,25 @@ class FutureText<T> extends StatelessWidget {
super.key,
required this.future,
required this.convertToString,
this.errorMessage = "Error",
});

final Future<T> future;
final String Function(T) convertToString;
final String errorMessage;

@override
Widget build(BuildContext context) {
return FutureBuilder(
future: future,
builder: (BuildContext context, AsyncSnapshot<T> snapshot) {
return Text(
snapshot.hasData && snapshot.data != null
? convertToString(snapshot
.data!) // ignore: null_check_on_nullable_type_parameter
: "N/A",
snapshot.hasError
? errorMessage
: snapshot.hasData && snapshot.data != null
? convertToString(snapshot
.data!) // ignore: null_check_on_nullable_type_parameter
: "N/A",
);
});
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import 'dart:io';

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:forui/forui.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:provider/provider.dart';

import 'package:network_info_app/pages/network_info/network_stats.dart';
import 'package:network_info_app/provider/connectivity_notifier.dart';
import 'package:network_info_app/widget/network_info/connectivity_stats.dart';

class ConnectivityInfoTiles extends StatelessWidget {
const ConnectivityInfoTiles({super.key, required this.conductivities});

class NetworkInfo extends StatelessWidget {
const NetworkInfo({super.key});
final List<ConnectivityResult> conductivities;

List<Widget> _getTiles(List<ConnectivityResult> conductivities) {
List<Widget> _generateTiles() {
List<Widget> tiles = [
FTile(
prefixIcon: FIcon(
@@ -27,7 +27,7 @@ class NetworkInfo extends StatelessWidget {
];

if (conductivities.contains(ConnectivityResult.wifi)) {
tiles.add(NetworkStats());
tiles.add(ConnectivityStats());
}

if (Platform.isAndroid &&
@@ -62,11 +62,9 @@ class NetworkInfo extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Consumer<ConnectivityNotifier>(
builder: (context, myNotifier, child) => Column(
spacing: 10,
children: _getTiles(myNotifier.connectionStatus),
),
return Column(
spacing: 10,
children: _generateTiles(),
);
}
}
122 changes: 122 additions & 0 deletions lib/widget/network_info/connectivity_stats.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:forui/forui.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:permission_handler/permission_handler.dart';

import 'package:network_info_app/widget/network_info/future_ftile.dart';

class ConnectivityStats extends StatefulWidget {
const ConnectivityStats({super.key});

@override
State<ConnectivityStats> createState() => _ConnectivityStatsState();
}

class _ConnectivityStatsState extends State<ConnectivityStats> {
final NetworkInfo _networkInfo = NetworkInfo();

Future<String?> _wifiName = Future<String?>.value(null);
Future<String?> _wifiBSSID = Future<String?>.value(null);
Future<String?> _wifiIPv4 = Future<String?>.value(null);
Future<String?> _wifiIPv6 = Future<String?>.value(null);
Future<String?> _wifiGatewayIP = Future<String?>.value(null);
Future<String?> _wifiBroadcast = Future<String?>.value(null);
Future<String?> _wifiSubMask = Future<String?>.value(null);

Future<String?> _initWifiName() async {
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
// Request permissions as recommended by the plugin documentation:
// https://github.com/fluttercommunity/plus_plugins/tree/main/packages/network_info_plus/network_info_plus
if (await Permission.locationWhenInUse.isGranted) {
return _networkInfo.getWifiName();
} else {
return 'Unauthorized to get Wifi Name';
}
} else {
return _networkInfo.getWifiName();
}
}

Future<String?> _initWifiBSSID() async {
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
// Request permissions as recommended by the plugin documentation:
// https://github.com/fluttercommunity/plus_plugins/tree/main/packages/network_info_plus/network_info_plus
if (await Permission.locationWhenInUse.isGranted) {
return _networkInfo.getWifiBSSID();
} else {
return 'Unauthorized to get Wifi BSSID';
}
} else {
return _networkInfo.getWifiBSSID();
}
}

void _init() async {
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
await Permission.locationWhenInUse.request();
}

setState(() {
_wifiName = _initWifiName();
_wifiBSSID = _initWifiBSSID();
_wifiIPv4 = _networkInfo.getWifiIP();
_wifiIPv6 = _networkInfo.getWifiIPv6();
_wifiGatewayIP = _networkInfo.getWifiGatewayIP();
_wifiBroadcast = _networkInfo.getWifiBroadcast();
_wifiSubMask = _networkInfo.getWifiSubmask();
});
}

@override
void initState() {
super.initState();

_init();
}

@override
Widget build(BuildContext context) {
return FTileGroup(
children: [
FutureFTile(
title: 'Wifi Name',
future: _wifiName,
errorMessage: 'Failed to get Wifi Name',
),
FutureFTile(
title: 'Wifi BSSID',
future: _wifiBSSID,
errorMessage: 'Failed to get Wifi BSSID',
),
FutureFTile(
title: 'Wifi IPv4',
future: _wifiIPv4,
errorMessage: 'Failed to get Wifi IPv4',
),
FutureFTile(
title: 'Wifi IPv6',
future: _wifiIPv6,
errorMessage: 'Failed to get Wifi IPv6',
),
FutureFTile(
title: 'Wifi Gateway',
future: _wifiGatewayIP,
errorMessage: 'Failed to get Wifi gateway address',
),
FutureFTile(
title: 'Wifi Broadcast',
future: _wifiBroadcast,
errorMessage: 'Failed to get Wifi broadcast',
),
FutureFTile(
title: 'Wifi Submask',
future: _wifiSubMask,
errorMessage: 'Failed to get Wifi submask address',
),
],
);
}
}
33 changes: 33 additions & 0 deletions lib/widget/network_info/future_ftile.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:forui/forui.dart';

import 'package:network_info_app/widget/future_text.dart';

class FutureFTile extends FTile {
FutureFTile({
super.key,
required String title,
required Future<String?> future,
required String errorMessage,
}) : super(
title: Text(title),
details: FutureText(
future: future,
convertToString: (String? s) => s ?? "N/A",
errorMessage: errorMessage,
),
onLongPress: () => _setClipboardData(future),
);

static void _setClipboardData(Future<String?> future) async {
try {
String? text = await future;
if (text != null) {
Clipboard.setData(ClipboardData(text: text));
}
} catch (e) {
// nothing to copy
}
}
}

0 comments on commit 05b56f6

Please sign in to comment.