根据蓝牙名称自动匹配对应 UI

要实现“根据蓝牙名称自动匹配对应 UI”,并且支持未来不断增加的按摩椅型号和UI,推荐采用插件式UI注册+自动路由的架构。下面是详细的可执行方案,适合你当前的 Flutter 项目结构:


1. 目录结构设计

假设每个按摩椅型号有独立的UI页面,建议目录结构如下:

lib/
  ui/
    page/
      massage/
        common/                # 公共组件、基类
        chair_control_screen.dart
        model_a/               # 型号A
          chair_control_screen_a.dart
        model_b/               # 型号B
          chair_control_screen_b.dart
        ...

2. UI注册与自动匹配机制

2.1 定义UI注册表

lib/ui/page/massage/common/ 下新建 massage_ui_registry.dart

// lib/ui/page/massage/common/massage_ui_registry.dart
import 'package:flutter/widgets.dart';

typedef MassageUIScreenBuilder = Widget Function();

class MassageUIRegistry {
  static final Map<String, MassageUIScreenBuilder> _registry = {};

  static void register(String modelKey, MassageUIScreenBuilder builder) {
    _registry[modelKey] = builder;
  }

  static Widget? getScreenForModel(String modelKey) {
    return _registry[modelKey]?.call();
  }
}

2.2 各型号UI注册

每个型号的UI在其入口文件注册自己。例如 model_a/chair_control_screen_a.dart

// lib/ui/page/massage/model_a/chair_control_screen_a.dart
import '../common/massage_ui_registry.dart';
import 'package:flutter/material.dart';

class ChairControlScreenA extends StatelessWidget {
  // ... UI实现 ...
  
  Widget build(BuildContext context) {
    return Scaffold(body: Center(child: Text('型号A UI')));
  }
}

// 注册到UI注册表
void registerModelAUI() {
  MassageUIRegistry.register('MODEL_A', () => ChairControlScreenA());
}

main.dart 或 app 启动时统一注册所有型号UI:

import 'ui/page/massage/model_a/chair_control_screen_a.dart' as model_a;
import 'ui/page/massage/model_b/chair_control_screen_b.dart' as model_b;
// ... 其他型号

void main() {
  model_a.registerModelAUI();
  model_b.registerModelBUI();
  // ...
  runApp(MyApp());
}

3. 蓝牙名称与型号Key的映射

新建 lib/ui/page/massage/common/model_key_mapper.dart

// lib/ui/page/massage/common/model_key_mapper.dart
class ModelKeyMapper {
  static String getModelKeyFromBluetoothName(String bluetoothName) {
    // 这里可以用正则或前缀匹配
    if (bluetoothName.startsWith('A-')) return 'MODEL_A';
    if (bluetoothName.startsWith('B-')) return 'MODEL_B';
    // ... 其他规则
    return 'DEFAULT'; // 默认UI
  }
}

4. 自动路由到对应UI

在你需要展示按摩椅UI的地方(比如连接蓝牙后),这样写:

import 'common/massage_ui_registry.dart';
import 'common/model_key_mapper.dart';

Widget buildChairScreen(String bluetoothName) {
  final modelKey = ModelKeyMapper.getModelKeyFromBluetoothName(bluetoothName);
  final screen = MassageUIRegistry.getScreenForModel(modelKey);
  if (screen != null) {
    return screen;
  } else {
    // 返回默认UI或错误提示
    return ChairControlScreen(); // 默认UI
  }
}

5. 新型号的扩展流程

  1. 新建目录和UI文件(如 model_c/chair_control_screen_c.dart)。
  2. 在该文件实现UI并注册到 MassageUIRegistry
  3. main.dart 注册该UI。
  4. ModelKeyMapper 里添加蓝牙名称到型号Key的映射规则。

6. 优点

  • 易扩展:新型号只需新建目录和注册,不影响其他UI。
  • 自动化:蓝牙名称自动路由到对应UI。
  • 解耦:UI与蓝牙逻辑分离,便于维护。
  • 兼容性:未匹配到的型号可回退到默认UI。

7. 进阶建议

  • 可以用注解+代码生成自动注册UI(如用 build_runner)。
  • 蓝牙名称与型号Key的映射可放到配置文件或后端下发,便于动态扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值