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

如何从void函数中获取变量值并传递给StatelessWidget使用

核心问题根因

  • 你在_showRouteDetails里创建的MapScreen(minuteRoutes: minuteDetails, lengthRoutes: lengthDetails)只是生成了一个MapScreen的实例,没有把这个实例挂载到Widget渲染树上,所以界面上看不到传值效果。
  • 你写的_stringReturn是MapScreen的内部方法,方法里声明的minRoutes和lenRoutes是局部变量,作用域仅限这个方法内部,方法执行完就销毁了,自然没法在build方法里调用。

可行实现方案

根据你的使用场景二选一即可:

方案1:MapScreen是当前页面的子组件(同页面展示)

用状态管理保存计算得到的时长、里程值,更新后触发UI重绘,把新值传给MapScreen:

  1. 把持有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),
      ],
    );
  }
}
  1. 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:04