google-maps - 通过单击颤动应用程序中的卡片小部件导航到谷歌地图的位置标记
问题描述
我从 Cloud Firestore 中获取了我的坐标(标记)。一切正常。但是当我尝试使用 pageview.builder 将我的标记与卡片链接时,它失败了。
我已经连接并从 firebase 获取所有标记:firestore。我遇到的唯一问题是我无法连接我的标记。也许在代码的末尾,我使用“Future”来指定相机在导航时的移动,并且我在 pageview.builder 之外使用了它。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:permission/permission.dart';
class Metro extends StatefulWidget {
@override
_MetroState createState() => _MetroState();
}
String stations;
class _MetroState extends State<Metro> {
// GoogleMapController _controller;
// final CameraPosition _initialPosition = CameraPosition(target: LatLng(9.0131, 38.7240), zoom: 17.0);
LatLng _initialPosition = LatLng(9.0131, 38.7240);
GoogleMapController _controller;
Location _location= Location();
int prevPage;
PageController _pageController;
void _onMapCreated(GoogleMapController _cntrl){
_controller = _cntrl;
_location.onLocationChanged.listen((l) {
_controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(l.latitude, l.longitude), zoom: 15)));
});
}
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
void initMarker(specify, specifyId) async {
var markerIdVal = specifyId;
final MarkerId markerId = MarkerId(markerIdVal);
final Marker marker = Marker(
markerId: markerId,
draggable: false,
position:
LatLng(specify['Location'].latitude, specify['Location'].longitude),
infoWindow: InfoWindow(title: specify['Name'], snippet: 'Station'),
);
setState(() {
markers[markerId] = marker;
},
);
_pageController = PageController(initialPage: 0, viewportFraction: 0.8)..addListener(_onScroll);
}
void _onScroll() {
if (_pageController.page.toInt() != prevPage) {
prevPage = _pageController.page.toInt();
moveCamera();
}
}
getMarkerData() async {
Firestore.instance.collection('route 1 markers').getDocuments().then((myMockDoc) {
if (myMockDoc.documents.isNotEmpty) {
for (int i = 0; i < myMockDoc.documents.length; i++) {
initMarker(myMockDoc.documents[i].data, myMockDoc.documents[i].documentID);
}
}
}
);
}
@override
void initState() { enter code here
getMarkerData();
super.initState();
}
@override
Widget build(BuildContext context) {
Set<Marker> getMarker() {
return <Marker>[
Marker(
markerId: MarkerId('Station'),
position: _initialPosition,
icon: BitmapDescriptor.defaultMarker,
infoWindow: InfoWindow(title: 'Home'))
].toSet();
}
return Scaffold(
// floatingActionButton: FloatingActionButton(
// onPressed: (){},
// backgroundColor: Colors.lightGreen,
// child: Icon(Icons.search),
// ),
body: Stack(
children: [
GoogleMap(
markers: Set<Marker>.of(markers.values),
mapType: MapType.normal,
initialCameraPosition: CameraPosition(target: _initialPosition, zoom: 25),
onMapCreated: _onMapCreated,
myLocationEnabled: true,
myLocationButtonEnabled: true,
mapToolbarEnabled: false,
),
Positioned(
bottom: 20.0,
child: Container(
height: 200,
width: MediaQuery.of(context).size.width,
child: StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('route 1 markers').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return new Text('Loading...');
default:
return PageView.builder( // Changes begin here
controller: _pageController,
scrollDirection: Axis.horizontal,
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
final document = snapshot.data.documents[index];
return AnimatedBuilder(
animation: _pageController,
builder: (BuildContext context, Widget widget){
double value = 1;
if (_pageController.position.haveDimensions) {
value = _pageController.page - index;
value = (1 - (value.abs() * 0.3) + 0.06).clamp(0.0, 1.0);
}
return Center(
child: SizedBox(
height: Curves.easeInOut.transform(value) * 125.0,
width: Curves.easeInOut.transform(value) * 350.0,
child: widget,
),
);
},
child: InkWell(
onTap: (){moveCamera();},
child: Stack(
children: [
Center(
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 10.0,
vertical: 20.0
),
height: 125,
width: 270,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
boxShadow: [
BoxShadow(
color: Colors.black54,
offset: Offset(0.0, 4.0),
blurRadius: 10.0,
),
]),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Colors.white
),
child: Row(
children: [
Container(
height: 90,
width: 90,
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10.0),
topLeft: Radius.circular(10.0)),
image: DecorationImage(
image: NetworkImage(
document['img']),
fit: BoxFit.cover))),
SizedBox(width: 5.0),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(
document['Name'],
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold),
),
Positioned(
bottom: 5.0,
child: Text(
"Addis Ababa, Ethiopia",
style: TextStyle(
fontSize: 13.0,
fontWeight: FontWeight.w600),
),
),
Container(
width: 170,
child: Text(
document['Detail'],
style: TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.w300),
),
),
],
)
],
),
),
),
)
],
),
),
);
}
);
}
},
),
))
],
),
);
}
Future<void> moveCamera() async{
_controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: document[_pageController.page.toInt()].Location,
zoom: 14.0,
tilt: 45.0,
bearing: 45.0,
)));
}
}
所以我需要你的帮助,请帮帮我。我发布了我的代码
解决方案
推荐阅读
- c# - mvc控制器参数在ajax调用中获取空值
- reactjs - Material UI 移除 TextField 自动填充的黄色背景
- javascript - 数据表:如何跳转到第一个空单元格
- mysql - 什么是更快/更好?更多的 SQL-Select 语句或多个详细的 sql 命令?
- c - 我希望循环复制空字符或其他内容,但它再次从头开始复制字符。这是为什么?这个循环是如何工作的?
- scroll - 在没有路由器交互的分页页面更改上滚动到页面顶部
- android - Xamarin.Forms - ControlTemplate 不显示 ContentPresenter
- javascript - jquery没有从动态输入字段中获取值
- php - Ajax 提交表单并存储在 PHP/WordPress 会话中
- subscriber - RTI DDS 两个应用程序在同一域上发布数据。当一个应用程序关闭并重新打开时,它会丢失数据。怎么解决?