You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Dart如何将widgets.dart中ScanResultTile的result数据传到main.dart类

可行实现方案

方案1:回调函数(最适合当前场景,学习成本最低)

这是Flutter中子组件向父组件传值最常用的轻量方案,只需要修改少量代码即可实现:

  • 第一步:修改widgets.dart中ScanResultTile类的回调参数定义,将无返回值的VoidCallback替换为可携带ScanResult数据的回调:
class ScanResultTile extends StatelessWidget {
  // 把原来的VoidCallback onTap替换为下面这个回调
  const ScanResultTile({Key key, this.result, required this.onResultSelected}) : super(key: key);

  final ScanResult result;
  // 定义可以传ScanResult参数的回调函数
  final Function(ScanResult) onResultSelected;

  // 其他原有代码不变...

  // 在你点击该Tile触发操作的位置调用回调,比如给外层包裹InkWell的onTap里加:
  InkWell(
    onTap: (){
      // 点击时把当前的result通过回调传出去
      onResultSelected(result);
    },
    // 你原有Tile的布局代码...
  )
}
  • 第二步:修改main.dart中_MyHomePageState的代码,定义变量接收传递过来的ScanResult,并在构建ScanResultTile时传入回调函数:
class _MyHomePageState extends State<MyHomePage> {
  // 新增变量存储拿到的ScanResult数据
  ScanResult? _currentScanResult;
  double _value = 40.0;
  double _valueP = 940.0;
  double _valueH = 54.0;

  @override
  Widget build(BuildContext context) {
    // 在你构建ScanResultTile的位置传入回调(不要直接new ScanResultTile(),要在扫描生成Tile的位置传值)
    return ScanResultTile(
      result: 扫描得到的result实例,
      onResultSelected: (result){
        setState(() {
          // 拿到传递过来的result数据,更新状态即可使用
          _currentScanResult = result;
          // 你也可以在这里直接解析数据赋值给_value/_valueP/_valueH等变量用于SF组件渲染
        });
      },
    );
  }
}

注意:你当前代码中直接实例化ScanResultTile jamJam = new ScanResultTile();是拿不到数据的,result属性是在扫描到蓝牙设备、生成ScanResultTile实例时才会赋值的,必须在构建Tile的位置传入回调才能拿到有效数据。

方案2:全局状态管理(适合复杂场景后续扩展)

如果你的APP后续有大量跨组件、跨页面的数据传递需求,可以用Provider/Riverpod等状态管理方案实现数据共享:

  • 定义一个继承ChangeNotifier的全局数据类,将需要共享的ScanResult变量放在类中,提供修改方法
  • 在APP顶层用ChangeNotifierProvider注册这个数据类
  • 在ScanResultTile中获取数据类实例,更新ScanResult值并通知监听
  • 在_MyHomePageState中监听数据类的变化,拿到更新后的ScanResult即可使用

方案3:事件总线(适合无父子关系的跨组件传递)

如果两个组件没有直接的父子嵌套关系,可以用事件总线实现广播式传值:

  • 定义全局的事件总线实例,定义ScanResultEvent事件类
  • 在ScanResultTile需要传值的位置发送ScanResultEvent事件,携带result数据
  • 在_MyHomePageState的initState生命周期中监听ScanResultEvent事件,收到事件后获取result数据更新状态即可

内容的提问来源于stack exchange,提问作者Harish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:45:05