import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vnote_device_plugin/devices/weight_height.dart'; import 'package:vnote_device_plugin/models/exams/weight_height.dart'; class WeightHeightCard extends StatefulWidget { final String mac; final String model; const WeightHeightCard({super.key, required this.mac, required this.model}); @override State createState() => _WeightHeightCardState(); } class _WeightHeightCardState extends State { late final WeightHeightDeviceWorker worker = WeightHeightDeviceWorker(mac: widget.mac, model: widget.model); WeightHeightExamData? value; bool _working = false; @override void initState() { worker.successEvent.addListener(_onSuccess); worker.errorEvent.addListener(_onError); super.initState(); } void _onSuccess(_, WeightHeightExamData e) { setState(() { value = e; }); } void _onError(_, String e) { Get.snackbar( "提示", "测量错误:$e", snackPosition: SnackPosition.TOP, ); } @override void dispose() { worker.successEvent.removeListener(_onSuccess); worker.errorEvent.removeListener(_onError); worker.disconnect(); super.dispose(); } @override Widget build(BuildContext context) { return Card( elevation: 4, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), child: Container( alignment: Alignment.center, width: 360, height: 240, child: SizedBox( height: 100, child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [ Center( child: Column( children: [ Row( children: [ Text( "${value != null ? double.parse(value!.height.toStringAsFixed(1)) : ""}", style: const TextStyle(fontSize: 40), ), const SizedBox( width: 8, ), const Text( "cm", style: TextStyle( fontSize: 20, ), ), ], ), Row( children: [ Text( "${value != null ? double.parse(value!.weight.toStringAsFixed(1)) : ""}", style: const TextStyle(fontSize: 40), ), const SizedBox( width: 8, ), const Text( "kg", style: TextStyle( fontSize: 20, ), ), ], ), ], ), ), const SizedBox( width: 24, ), SizedBox( width: 60, height: 60, child: _working ? OutlinedButton( style: ButtonStyle( backgroundColor: MaterialStatePropertyAll( Colors.red.withOpacity(.08), ), shape: MaterialStatePropertyAll( RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), ), onPressed: () async { await worker.disconnect(); setState(() { _working = false; }); }, child: const Text( '停止', style: TextStyle(color: Colors.red), )) : OutlinedButton( style: ButtonStyle( backgroundColor: MaterialStatePropertyAll( Theme.of(context).primaryColor.withOpacity(.08), ), shape: MaterialStatePropertyAll( RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), ), onPressed: () async { await worker.connect(); setState(() { _working = true; }); }, child: const Text("开始测量"), ), ), ], ), ), ), ); } }