Files
CloudHome-Ops/lib/widgets/device_list_tile.dart

91 lines
2.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import '../models/device.dart';
import '../services/device_service.dart';
import '../utils/i10n.dart';
import 'device_command_sheet.dart';
import 'status_chip.dart';
/// 设备列表项。
class DeviceListTile extends StatelessWidget {
const DeviceListTile({
super.key,
required this.device,
this.onTap,
});
/// 设备数据。
final Device device;
/// 点击回调。
final VoidCallback? onTap;
IconData _iconByStatus() {
switch (device.status) {
case DeviceStatus.online:
return Icons.dns;
case DeviceStatus.offline:
return Icons.dns_outlined;
case DeviceStatus.warning:
return Icons.warning_amber;
}
}
String _title(BuildContext context) {
// 设备标识以 MAC 为主(房号独立显示在副标题,不再用「/」粘连)。
return device.macLabel;
}
String _subtitle(BuildContext context) {
// 副标题保持「门店 + 型号」不变,并追加独立的「房号:XXX」字段。
final t = AppLocalizations.of(context);
final store = device.storeName.isEmpty
? t.deviceSubtitleStore(t.deviceSubtitleNotSet)
: t.deviceSubtitleStore(device.storeName);
final model = '${t.modelLabel}:${device.model.isNotEmpty ? device.model : t.deviceSubtitleNotSet}';
final room = '${t.roomNo}:${device.roomNo.isNotEmpty ? device.roomNo : t.deviceSubtitleNotSet}';
return '$store $model $room';
}
void _showCommandSheet(BuildContext context) {
showModalBottomSheet(
useSafeArea: true,
context: context,
isScrollControlled: true,
builder: (ctx) => DeviceCommandSheet(
device: device,
deviceService: DeviceService(),
),
);
}
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),
child: ListTile(
leading: Icon(_iconByStatus(), size: 32),
title: Text(
_title(context),
style: const TextStyle(fontWeight: FontWeight.w600),
),
subtitle: Text(_subtitle(context)),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Builder(
builder: (context) => IconButton(
icon: const Icon(Icons.touch_app_outlined),
tooltip: AppLocalizations.of(context).sendCommand,
onPressed: () => _showCommandSheet(context),
),
),
StatusChip(status: device.status),
],
),
onTap: onTap,
),
);
}
}