如何从void函数中获取变量值并传递给StatelessWidget使用
核心问题根因
- 你在
_showRouteDetails里创建的MapScreen(minuteRoutes: minuteDetails, lengthRoutes: lengthDetails)只是生成了一个MapScreen的实例,没有把这个实例挂载到Widget渲染树上,所以界面上看不到传值效果。 - 你写的
_stringReturn是MapScreen的内部方法,方法里声明的minRoutes和lenRoutes是局部变量,作用域仅限这个方法内部,方法执行完就销毁了,自然没法在build方法里调用。
可行实现方案
根据你的使用场景二选一即可:
方案1:MapScreen是当前页面的子组件(同页面展示)
用状态管理保存计算得到的时长、里程值,更新后触发UI重绘,把新值传给MapScreen:
- 把持有Routing类的上层Widget改为StatefulWidget,声明可更新的状态变量:
class _CurrentPageState extends State<CurrentPage> { String? _minuteDetails; String? _lengthDetails; // 调整_showRouteDetails逻辑,计算完成后更新状态 void _showRouteDetails(here.Route route) { int estimatedTravelTimeInSeconds = route.durationInSeconds; int lengthInMeters = route.lengthInMeters; String minuteDetails = _formatTime(estimatedTravelTimeInSeconds); String lengthDetails = _formatLength(lengthInMeters); setState(() { _minuteDetails = minuteDetails; _lengthDetails = lengthDetails; }); } @override Widget build(BuildContext context) { return Column( children: [ // 页面其他组件 // 直接把状态变量传给MapScreen即可自动刷新 MapScreen(minuteRoutes: _minuteDetails, lengthRoutes: _lengthDetails), ], ); } }
- 简化MapScreen类,删除无用的
_stringReturn方法:
class MapScreen extends StatelessWidget{ const MapScreen({ Key? key, this.minuteRoutes, this.lengthRoutes, }) : super(key: key); final String? minuteRoutes; final String? lengthRoutes; @override Widget build(BuildContext context) { return Container( child: Text(minuteRoutes??"Empty"), ); } }
方案2:MapScreen是独立路由页面(点击后跳转新页面展示)
创建MapScreen实例后,通过Navigator执行页面跳转即可:
void _showRouteDetails(here.Route route) { int estimatedTravelTimeInSeconds = route.durationInSeconds; int lengthInMeters = route.lengthInMeters; String minuteDetails = _formatTime(estimatedTravelTimeInSeconds); String lengthDetails = _formatLength(lengthInMeters); // 跳转到新的MapScreen页面 Navigator.of(context).push(MaterialPageRoute( builder: (context) => MapScreen(minuteRoutes: minuteDetails, lengthRoutes: lengthDetails), )); }
补充:如果Routing是独立业务逻辑类
如果Routing不是Widget子类,你可以给它加回调函数,把计算得到的两个值抛给上层Widget处理:
class Routing{ // 定义回调参数 final Function(String minute, String length) onRouteDetailsCalculated; Routing({required this.onRouteDetailsCalculated}); void _showRouteDetails(here.Route route) { int estimatedTravelTimeInSeconds = route.durationInSeconds; int lengthInMeters = route.lengthInMeters; String minuteDetails = _formatTime(estimatedTravelTimeInSeconds); String lengthDetails = _formatLength(lengthInMeters); // 把值通过回调抛给上层Widget onRouteDetailsCalculated(minuteDetails, lengthDetails); } }
上层Widget初始化Routing时传入回调,在回调里执行setState或者跳转逻辑即可。
内容的提问来源于stack exchange,提问作者Septian Dika
相关产品推荐
相关产品推荐

