이제 앞서 포스팅한 google 지도와 연동하여 또 다른 플러그 인을 사용해 보자.
바로 google maps flutter 이다.
물론 실제 사내에서 이것들 도입하기란 쉽지 않다 돈과 직결되어있기 때문에 무료인 오픈소스들을 사용할 텐데
지금 포스팅 하는 구글 지도를 통하여 추후 라이브러리를 사용하는 법을 익힌다고 생각해도 좋을 듯 하다.
m
이면 위에 것으로, .swift
라면 아래것으로 replace 하면 된다.class MapScreen extends StatefulWidget {
const MapScreen(
{super.key,
this.location = const PlaceLocation(
latitude: 37.422,
longtitude: -122.084,
address: '',
),
this.isSelection = true});
final PlaceLocation location;
final bool isSelection;
State<MapScreen> createState() {
return _MapScreenState();
}
}
class _MapScreenState extends State<MapScreen> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.isSelection ? 'Pick ur loacation' : 'ur location'),
actions: [
if (widget.isSelection)
IconButton(
onPressed: () {},
icon: const Icon(Icons.save),
)
],
),
body: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(widget.location.latitude, widget.location.longtitude),
zoom: 16,
),
markers: {
Marker(
markerId: const MarkerId('m1'),
position: LatLng(
widget.location.latitude,
widget.location.longtitude,
),
),
},
),
);
}
}
PlaceLocation이라는 타입을 갖는 변수를 지정하고 isSelection 변수로 사람이 지도에서 선택한 여부를 체크하기위해 변수를 또 만들어준다.
이 위젯이 또 하나의 화면을 맡기 때문에 Scaffold 위젯으로 시작한다. 이때 최상단의 AppBar에서 isSelection의 여부에 따라 아이콘이 보여지냐 마느냐를 보여준다.
body 부분에 실제 dynamic 지도가 들어갈 부분이다. 위 코드에서 사용된 CameraPosition, Marker 객체들은 모두 Google Maps Flutter에서 제공하는 것으로 공식문서에서 찾아서 쓰면 된다.
??
앞에 쓰인 변수가 null이라면 뒤에 변수를 써라라는 뜻이다. Marker(
markerId: const MarkerId('m1'),
position: _pickedLocation != null
? _pickedLocation!
: LatLng(
widget.location.latitude,
widget.location.longtitude,
),
),
Marker(
markerId: const MarkerId('m1'),
position: _pickedLocation ?? LatLng(
widget.location.latitude,
widget.location.longtitude,
),
),
void _selectOnMap() async {
final pickedLocation = await Navigator.of(context).push<LatLng>(
MaterialPageRoute(
builder: (ctx) => const MapScreen(),
),
);
if (pickedLocation == null) {
return;
}
_savePlace(pickedLocation.latitude, pickedLocation.longitude);
}
class _MapScreenState extends State<MapScreen> {
LatLng? _pickedLocation;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.isSelection ? 'Pick ur loacation' : 'ur location'),
actions: [
if (widget.isSelection)
IconButton(
onPressed: () {
Navigator.of(context).pop(_pickedLocation);
},
icon: const Icon(Icons.save),
)
],
),
body: GoogleMap(
onTap: !widget.isSelection
? null
: (position) {
setState(() {
_pickedLocation = position;
});
},
initialCameraPosition: CameraPosition(
target: LatLng(widget.location.latitude, widget.location.longtitude),
zoom: 16,
),
markers: (_pickedLocation == null && widget.isSelection)
? {}
: {
Marker(
markerId: const MarkerId('m1'),
position: _pickedLocation ??
LatLng(
widget.location.latitude,
widget.location.longtitude,
),
),
},
),
);
}
}
_pickedLocation
변수를 사용자가 Tap으로 선택을 했는지 여부를 확인하기위해 선언해주고
저장 버튼은 밑에서 선택한 position 좌표를 _pickedLocation
에 저장하면 던져주면서 Navigator pop 메서드로 빠져나온다.
isSelection
은 추후 사용자가 선택할 수 있는지 여부를 저장하는 변수이다. 즉 나중에 detail 페이지에서 사용자가 이미 선택한 부분이라면 onTap을 막음으로써 마커를 임의로 욺직일 수 없도록 조절하는 변수이다.
onTap
에는 isSelection이 false일 때 null을 부여하여 onTap이 기능하지 않도록 하고 true일 땐 position을 넘겨받아 선택된 장소(_pickedLocation
)을 업데이트를 해준다. 그리고 이를 setState 메서드를 활용하여 build 메서드를 재실행함으로써 사용자로 하여금 클릭한 부분에 마커를 올릴 수 있도록 해준다.