Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions lib/bean/widget/battery_status_icon.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:battery_plus/battery_plus.dart';

class BatteryStatusIcon extends StatefulWidget {
const BatteryStatusIcon({
super.key,
this.color = Colors.white,
this.size = 20,
});

final Color color;
final double size;

@override
State<BatteryStatusIcon> createState() => _BatteryStatusIconState();
}

class _BatteryStatusIconState extends State<BatteryStatusIcon> {
final Battery _battery = Battery();
late final Stream<int> _batteryLevelStream;
late final Stream<BatteryState> _batteryStateStream;

@override
void initState() {
super.initState();
_batteryLevelStream = (() async* {
try {
yield await _battery.batteryLevel;
} catch (_) {
yield -1;
}
yield* Stream.periodic(const Duration(seconds: 30)).asyncMap((_) async {
try {
return await _battery.batteryLevel;
} catch (_) {
return -1;
}
});
})();
_batteryStateStream = _battery.onBatteryStateChanged;
}

@override
Widget build(BuildContext context) {
return StreamBuilder<int>(
stream: _batteryLevelStream,
initialData: -1,
builder: (context, levelSnapshot) {
final level = levelSnapshot.data ?? -1;
return StreamBuilder<BatteryState>(
stream: _batteryStateStream,
initialData: BatteryState.unknown,
builder: (context, stateSnapshot) {
final state = stateSnapshot.data ?? BatteryState.unknown;
return _batteryIcon(level, state);
},
);
},
);
}

Widget _batteryIcon(int level, BatteryState state) {
if (state == BatteryState.charging) {
return Icon(
Icons.battery_charging_full_rounded,
size: widget.size,
color: Colors.greenAccent,
);
}
if (state == BatteryState.full || level >= 95) {
return Icon(
Icons.battery_full_rounded,
size: widget.size,
color: widget.color,
);
}
if (level < 0) {
return Icon(
Icons.battery_unknown_rounded,
size: widget.size,
color: widget.color,
);
}
if (level <= 10) {
return Icon(
Icons.battery_0_bar_rounded,
size: widget.size,
color: Colors.redAccent,
);
}
if (level <= 25) {
return Icon(
Icons.battery_1_bar_rounded,
size: widget.size,
color: Colors.yellowAccent,
);
}
if (level <= 50) {
return Icon(
Icons.battery_3_bar_rounded,
size: widget.size,
color: widget.color,
);
}
if (level <= 75) {
return Icon(
Icons.battery_5_bar_rounded,
size: widget.size,
color: widget.color,
);
}
return Icon(
Icons.battery_6_bar_rounded,
size: widget.size,
color: widget.color,
);
}
}
26 changes: 14 additions & 12 deletions lib/bean/widget/collect_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,18 +104,20 @@ class _CollectButtonState extends State<CollectButton> {
label: Text(getTypeStringByInt(collectType)),
);
} else {
return IconButton(
onPressed: () {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
}
},
tooltip: getTypeStringByInt(collectType),
icon: Icon(
getIconByInt(collectType),
color: widget.color,
return Tooltip(
message: getTypeStringByInt(collectType),
child: InkWell(
onTap: () {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
}
},
child: Icon(
getIconByInt(collectType),
color: widget.color,
),
),
);
}
Expand Down
55 changes: 55 additions & 0 deletions lib/bean/widget/network_status_icon.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'package:flutter/material.dart';
import 'package:connectivity_plus/connectivity_plus.dart';

class NetworkStatusIcon extends StatefulWidget {
const NetworkStatusIcon({
super.key,
this.color = Colors.white,
this.size = 18,
});

final Color color;
final double size;

@override
State<NetworkStatusIcon> createState() => _NetworkStatusIconState();
}

class _NetworkStatusIconState extends State<NetworkStatusIcon> {
late final Stream<List<ConnectivityResult>> _connectivityStream;

@override
void initState() {
super.initState();
_connectivityStream = Connectivity().onConnectivityChanged;
}

IconData _networkIconForResults(List<ConnectivityResult> results) {
if (results.contains(ConnectivityResult.wifi)) {
return Icons.wifi_rounded;
}
if (results.contains(ConnectivityResult.ethernet)) {
return Icons.cable;
}
if (results.contains(ConnectivityResult.mobile)) {
return Icons.signal_cellular_alt;
}
return Icons.signal_wifi_off_rounded;
}

@override
Widget build(BuildContext context) {
return StreamBuilder<List<ConnectivityResult>>(
stream: _connectivityStream,
initialData: const [ConnectivityResult.none],
builder: (context, snapshot) {
final results = snapshot.data ?? const [ConnectivityResult.none];
return Icon(
_networkIconForResults(results),
color: widget.color,
size: widget.size,
);
},
);
}
}
Loading
Loading