Flutter map_view插件改造:实现可变经纬度而非固定值
Alright, let's figure out how to make that Locations class work with variable coordinates instead of hardcoded values. The original setup uses static, fixed Location instances, which is great for defaults but not so much when you need dynamic lat/lng (like from GPS or user input). Here are a few practical approaches, plus a best practice to keep your code safe from plugin updates:
方案1:直接在应用层创建动态Location实例(最推荐)
You don't even need to touch the plugin's locations.dart for this. Just import the Location class directly into your app code and instantiate it with your dynamic values. This keeps your code decoupled from the plugin's internal setup, so you won't lose changes if the plugin updates.
Here's how to use it in your main.dart:
import 'package:map_view/location.dart'; // Import the base Location class @override void initState() { super.initState(); // Example: Get dynamic coordinates (replace with your actual data source, like GPS) Future.delayed(Duration.zero, () async { double userLat = await getCurrentUserLatitude(); // Your method to fetch latitude double userLng = await getCurrentUserLongitude(); // Your method to fetch longitude // Create a dynamic Location instance Location dynamicLocation = Location(userLat, userLng); // Use this dynamicLocation with your map view logic // e.g., mapView.moveCamera(CameraPosition(target: dynamicLocation)); }); }
方案2:修改插件的Locations类以支持动态创建
If you really want to extend the plugin's Locations class (note: this will be overwritten if you update the plugin), you can add static methods to generate custom Location instances instead of relying on the fixed ones.
Update the plugin's locations.dart like this:
import 'location.dart'; class Locations { // Keep the original fixed locations as defaults if needed static const defaultPortlandLat = 37.0902; static const defaultPortlandLng = 37.0902; static const defaultCenterOfUSALat = 37.0902; static const defaultCenterOfUSALng = -95.7192; // Static method to create a custom Portland location with dynamic coords static Location customPortland(double lat, double lng) { return Location(lat, lng); } // Static method to create a custom USA center location static Location customCenterOfUSA(double lat, double lng) { return Location(lat, lng); } // Generic method for any custom location static Location createCustomLocation(double lat, double lng) { return Location(lat, lng); } }
Then use it in your app:
@override void initState() { super.initState(); // Example dynamic coords double customLat = 40.7128; // NYC latitude double customLng = -74.0060; // NYC longitude Location nycLocation = Locations.createCustomLocation(customLat, customLng); // Or update the Portland location Location updatedPortland = Locations.customPortland(37.1, 37.1); }
方案3:让静态Location属性可更新
Another option is to let the existing static properties be modified after initialization. Again, this requires changing the plugin's code, which has update risks.
Update locations.dart:
import 'location.dart'; class Locations { // Remove 'final' so these can be reassigned static Location portland = Location(37.0902, 37.0902); static Location centerOfUSA = Location(37.0902, -95.7192); // Add methods to update the static locations static void updatePortland(double lat, double lng) { portland = Location(lat, lng); } static void updateCenterOfUSA(double lat, double lng) { centerOfUSA = Location(lat, lng); } }
Use it in your app:
@override void initState() { super.initState(); // Update the Portland location to new coords Locations.updatePortland(37.2, 37.2); // Now Locations.portland uses the new values Location updatedPortland = Locations.portland; }
Important Best Practice
Directly modifying third-party plugin code is risky—any plugin update will overwrite your changes. Instead, create your own utility class in your project to handle dynamic locations:
// custom_locations.dart in your app import 'package:map_view/location.dart'; class CustomLocations { // Default locations if needed static Location get defaultPortland => Location(37.0902, 37.0902); static Location get defaultCenterOfUSA => Location(37.0902, -95.7192); // Dynamic location creator static Location create(double lat, double lng) { return Location(lat, lng); } }
This way, you're in full control and don't have to worry about plugin updates breaking your code.
内容的提问来源于stack exchange,提问作者Nitneuq

