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
相关产品推荐
相关产品推荐

