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

