Как получить доступ к контроллеру FlutterMap из другого класса
Я пытаюсь найти способ доступа к контроллеру flutter_map извне класса, идея заключается в том, что у меня есть маркеры на экране карты. когда вы нажимаете на маркер, карта должна двигаться так, чтобы пикантный маркер находился посередине
Проблема в том, что класс маркера Initial находится в другом классе, поэтому я не могу сразу получить доступ к управлению картой
как я могу заставить карту двигаться?
./screens/homeScreen.dart
class HomeScreen extends StatefulWidget {
static const routeName = '/home';
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
Widget build(BuildContext context) {
return Scaffold(
body:FlutterMap(
mapController: _mapController,
MarkerClusterLayerOptions(
onMarkerTap: (_) {
}, // Cluster tab
markers:externalReports.items // get the markers list
centerMarkerOnClick: true, // Cluster center
....),);}}
./externalReports.dart // where The Items Initial
_items.add(
Marker(
optionalDataContainer: data,
width: 45.0,
height: 45.0,
point: LatLng(
latitude,
longitude,),
builder: (context) => Container(
child: Container(
height: 45,
width: 45,
child: GestureDetector(
onTap: () {
// _mapController.move(LatLng(latitude,longitude), 15.0);
}))))
2 ответа
Решение
Самый простой вариант, который я вижу, - это преобразовать его в глобальный экземпляр. (или вы можете сделать его статичным).
Но надо сказать, что эти варианты не очень "красивые"...
Вы можете предоставить обратный вызов onClick для Marker
Что-то вроде этого:
class YourMarker extends StatelessWidget {
final double latitude;
final double longitude;
final Function(double, double) onClick;
YourMarker({
this.latitude,
this.longitude,
this.onClick,
});
@override
Widget build(BuildContext context) {
return Marker(
optionalDataContainer: data,
width: 45.0,
height: 45.0,
point: LatLng(
latitude,
longitude,
),
builder: (context) => Container(
child: Container(
height: 45,
width: 45,
child: GestureDetector(
onTap:
() {
onClick(latitude, longitude);
// _mapController.move(LatLng(latitude,longitude), 15.0);
},
),
),
),
);
}
}