You need to enable JavaScript to run this app. Flutter同项目中request.dart如何调用main.dart内定义的Position类?
优惠活动
大模型
产品
解决方案
定价
更多

Flutter同项目中request.dart如何调用main.dart内定义的Position类?

解决方法

前置说明

你遇到的报错不是找不到Position类,Position是geolocator包提供的公共类,你的两个文件都已经导入了package:geolocator/geolocator.dart,类定义是可访问的。报错本质是你在request.dart的getRequest方法里没有获取到main.dart中实例化的position对象。

方案1:直接传参(最推荐,耦合度最低)

直接将Position实例作为参数传入getRequest方法,修改代码如下:

第一步:修改request.dart代码

import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;
import 'package:rider_app/configMaps.dart';
// 修正导入路径,不需要多余的lib
import 'package:rider_app/AllScreens/mainscreen.dart';

class RequestAssistant
{
  // 新增Position类型入参,删除原本重复无用的url参数
  static Future<dynamic> getRequest(Position position) async
  {
    var url = Uri.parse("https://maps.googleapis.com/maps/api/geocode/json?latlng=${position.latitude},${position.longitude}&key=$mapKey");

    http.Response response = await http.get(url);

    try
    {
      if(response.statusCode==200)
      {
        String jSonData = response.body;
        var decodeData = jsonDecode(jSonData);
        return decodeData;
      }
      else
      {
        return "failed";
      }
    }
    catch(exp)
    {
      return "failed";
    }
  }
}

第二步:在main.dart调用时传入实例

在你拿到位置实例后调用getRequest时,直接把position传入即可:

void locatePosition() async
{
  Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  currentPosition= position;
  // 调用请求方法,传入当前位置实例
  var requestResult = await RequestAssistant.getRequest(position);
  // 这里可以写处理返回结果的逻辑

  LatLng latLatPosition = LatLng(position.latitude, position.longitude);
  //Camera move
  CameraPosition cameraPosition = new CameraPosition(target: latLatPosition, zoom: 16);
  newGoogleMapController.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));

  String address = await AssistantMethods.searchCoordinateAddress(position, context);
  
}

方案2:全局状态管理(适合多页面频繁使用位置信息的场景)

你的项目已经引入了Provider状态管理,可以直接把当前位置存在全局状态中,任意页面都可读取:

第一步:修改AppData类

在你的appData.dart中新增位置存储逻辑:

class AppData extends ChangeNotifier {
  // 新增当前位置变量
  Position? currentPosition;

  // 更新位置的方法
  void updateCurrentPosition(Position newPosition) {
    currentPosition = newPosition;
    notifyListeners();
  }

  // 你原本的其他逻辑
}

第二步:main.dart拿到位置后更新全局状态

void locatePosition() async
{
  Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  currentPosition= position;
  // 更新到全局状态
  Provider.of<AppData>(context, listen: false).updateCurrentPosition(position);
  // 其他原有逻辑
}

第三步:任意位置调用getRequest时先取全局位置

// 读全局位置
Position? currentPos = Provider.of<AppData>(context, listen: false).currentPosition;
if(currentPos != null) {
  var requestResult = await RequestAssistant.getRequest(currentPos);
}

注意事项

  • 你原本request.dart中导入main.dart的路径多了lib层级,属于错误写法,按上面的修正后即可正常导入
  • 不要尝试直接跨文件访问State类的私有属性,耦合度极高且容易引发生命周期问题,优先用传参或状态管理的方式传递实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 17:24:02