兄弟,我做到了。我可以通过两种方式检索它。
1.使用简单的“ initState”手动进行。
2.使用提供程序(但是使用第二种方法,我还没有成功显示标记)。希望可以帮助您,尽管很久以前。这是我通过使用'initState'来实现的:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'package:visitmalang/provider/aktivitas_provider.dart';
import 'package:visitmalang/ui/home/beranda/aktivitas/profil_agen_wisata.dart';
import 'package:visitmalang/ui/widget/textcustom.dart';
class MapAktivitas extends StatefulWidget {
@override
_MapAktivitasState createState() => _MapAktivitasState();
}
class _MapAktivitasState extends State<MapAktivitas> {
Map<MarkerId,Marker> markers = <MarkerId,Marker>{};
GoogleMapController mapController;
bool mapToggle = false;
bool geraiToggle = false;
var currentLocation;
var clients = [];
@override
void initState() {
// TODO: implement initState
super.initState();
Geolocator().getCurrentPosition().then((lokasiSekarang) {
setState(() {
currentLocation = lokasiSekarang;
mapToggle = true;
populateClients();
});
});
}
populateClients() {
clients = [];
Firestore.instance.collection('trail').getDocuments().then((docs) {
if (docs.documents.isNotEmpty) {
setState(() {
geraiToggle = true;
});
for (int i = 0; i < docs.documents.length; i++) {
clients.add(docs.documents[i].data);
initMarker(docs.documents[i].data,docs.documents[i].documentID);
}
}
});
}
void initMarker(request,requestId) {
var markerIdVal = requestId;
final MarkerId markerId = MarkerId(markerIdVal);
final Marker marker = Marker(
markerId: markerId,position: LatLng(
request['koordinat'].latitude,request['koordinat'].longitude),infoWindow: InfoWindow(title: request['nama']));
setState(() {
markers[markerId] = marker;
});
}
Widget clientCard(client) {
return Padding(
padding: const EdgeInsets.only(left: 8.0,top: 8.0),child: InkWell(
onTap: () {
zoomInMarker(client);
},child: Stack(
alignment: FractionalOffset(0.5,0.94),children: <Widget>[
Material(
elevation: 4.0,borderRadius: BorderRadius.circular(10.0),child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),color: Colors.white,),height: 108,width: 200,child: Row(
crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[
//
ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.0),bottomLeft: Radius.circular(10.0)),child: Container(
width: 96,child: Image.asset(
'assets/trail.png',fit: BoxFit.cover,SizedBox(
width: 4,Stack(
alignment: FractionalOffset(0.5,0.9),children: <Widget>[
Container(
width: 100,child: Padding(
padding: const EdgeInsets.only(top: 8.0),child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8.0),child: Container(
alignment: Alignment.center,child: textCustom(client['nama'],Colors.black87,14,'Montserrat'),],ClipRRect(
borderRadius: BorderRadius.circular(10),child: InkWell(
onTap: () => Navigator.of(context).push(
CupertinoPageRoute(
builder: (BuildContext context) =>
ProfilAgenWisata(
nama: client['nama'],deskripsi: client['deskripsi'],website: client['website'],email: client['email'],noTelepon: client['noTelepon'],whatsApp: client['whatsApp'],alamat: client['alamat'],fasilitas: client['fasilitas'],))),child: Container(
alignment: Alignment.center,color: Color(0xFFDB5C48),height: 40,width: 88,child: textCustom(
'Detail',Colors.white,)
],)),);
}
zoomInMarker(client) {
mapController.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: LatLng(
client['koordinat'].latitude,client['koordinat'].longitude),zoom: 16.0,bearing: 19.0,tilt: 15.0),);
}
@override
Widget build(BuildContext context) {
// AktivitasNotifier aktivitasNotifier = Provider.of<AktivitasNotifier>(context);
return Scaffold(
appBar: AppBar(
title: textCustom('Ngetrail',18,centerTitle: true,elevation: 0.0,backgroundColor: Colors.transparent.withOpacity(0.0),leading: IconButton(
icon: Icon(Icons.arrow_back_ios,color: Colors.black87),onPressed: (){Navigator.pop(context);},body: Stack(
children: <Widget>[
Column(
children: <Widget>[
Container(
width: double.infinity,height: MediaQuery.of(context).size.height - 80,child: mapToggle
? GoogleMap(
myLocationEnabled: true,myLocationButtonEnabled: true,markers: Set<Marker>.of(markers.values),compassEnabled: false,zoomControlsEnabled: false,mapType: MapType.normal,initialCameraPosition: CameraPosition(
target: LatLng(currentLocation.latitude,currentLocation.longitude),zoom: 15),onMapCreated: (controller) {
setState(() {
mapController = controller;
});
},)
: Center(
child: textCustom(
'Loading...',20,'Hind')),Column(
mainAxisAlignment: MainAxisAlignment.end,children: <Widget>[
Container(
height: 140.0,width: MediaQuery.of(context).size.width,child: geraiToggle
? ListView(
scrollDirection: Axis.horizontal,padding: EdgeInsets.all(8.0),children: clients.map((element) {
return clientCard(element);
}).toList(),)
: Container(),SizedBox(
height: 56.0,)
],)
],));
}
}
,
这是使用提供程序的第二种方法。
首先,您必须确定模型(只关注“ koordinat”):
class ModelAktivitas {
String idAktivitas;
var koordinat;
String nama;
String deskripsi;
String alamat;
String email;
String noTelepon;
String website;
String gambarUtama;
List galeri;
List fasilitas;
ModelAktivitas.fromMap(Map<String,dynamic> data) {
idAktivitas = data['idAktivitas'];
koordinat = data['koordinat'];
nama = data['nama'];
deskripsi = data['deskripsi'];
noTelepon = data['nomorTelepon'];
galeri = data['galeri'];
fasilitas = data['fasilitas'];
alamat = data['alamat'];
email = data['alamat'];
gambarUtama = data['gambarUtama'];
website = data['website'];
}
}
秒,为其提供提供商:
import 'dart:collection';
import 'package:flutter/cupertino.dart';
import 'package:visitmalang/models/aktivitas_model.dart';
class AktivitasNotifier with ChangeNotifier {
List<ModelAktivitas> _listAktivitas = [];
ModelAktivitas _detailAktivitas;
UnmodifiableListView<ModelAktivitas> get listAktivitas =>
UnmodifiableListView(_listAktivitas);
ModelAktivitas get detailAktivitas => _detailAktivitas;
set listAktivitas(List<ModelAktivitas> listAktivitas) {
_listAktivitas = listAktivitas;
notifyListeners();
}
set detailAktivitas(ModelAktivitas aktivitas) {
_detailAktivitas = aktivitas;
notifyListeners();
}
}
然后,从您的Firestore服务中添加“获取”:
getListAktivitas(AktivitasNotifier aktivitasNotifier) async {
QuerySnapshot snapshot =
await Firestore.instance.collection('trail').getDocuments();
List<ModelAktivitas> _listAktivitas = [];
snapshot.documents.forEach((doc) {
ModelAktivitas modelAktivitas = ModelAktivitas.fromMap(doc.data);
_listAktivitas.add(modelAktivitas);
});
aktivitasNotifier.listAktivitas = _listAktivitas;
}
然后,最后一步将其流式传输到您的UI代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'package:visitmalang/provider/aktivitas_provider.dart';
import 'package:visitmalang/ui/home/beranda/aktivitas/profil_agen_wisata.dart';
import 'package:visitmalang/ui/widget/textcustom.dart';
import 'package:visitmalang/service/user_service.dart';
class MapAktivitasTandingan extends StatefulWidget {
@override
_MapAktivitasTandinganState createState() => _MapAktivitasTandinganState();
}
class _MapAktivitasTandinganState extends State<MapAktivitasTandingan> {
Map<MarkerId,Marker>{};
GoogleMapController mapController;
bool mapToggle = false;
bool geraiToggle = false;
var currentLocation;
@override
void initState() {
// TODO: implement initState
super.initState();
Geolocator().getCurrentPosition().then((lokasiSekarang) {
setState(() {
currentLocation = lokasiSekarang;
mapToggle = true;
});
});
AktivitasNotifier aktivitasNotifier =
Provider.of<AktivitasNotifier>(context,listen: false);
getListAktivitas(aktivitasNotifier);
}
@override
Widget build(BuildContext context) {
AktivitasNotifier aktivitasNotifier =
Provider.of<AktivitasNotifier>(context);
return Scaffold(
appBar: AppBar(
title: textCustom('Ngetrail',leading: IconButton(
icon: Icon(Icons.arrow_back_ios,onPressed: () {
Navigator.pop(context);
},markers: {
},children: <Widget>[
Container(
height: 140.0,child: ListView.builder(
scrollDirection: Axis.horizontal,itemCount: aktivitasNotifier.listAktivitas.length,itemBuilder: (BuildContext context,int index) {
return Padding(
padding: const EdgeInsets.only(left: 8.0,child: InkWell(
onTap: () {
mapController.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: LatLng(
aktivitasNotifier
.listAktivitas[index]
.koordinat
.latitude,aktivitasNotifier
.listAktivitas[index]
.koordinat
.longitude),);
},child: Stack(
alignment: FractionalOffset(0.5,children: <Widget>[
Material(
elevation: 4.0,child: Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(10.0),child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,children: <Widget>[
//
ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.0),bottomLeft:
Radius.circular(10.0)),child: Container(
width: 96,child: Image.asset(
'assets/trail.png',SizedBox(
width: 4,Stack(
alignment:
FractionalOffset(0.5,children: <Widget>[
Container(
width: 100,child: Padding(
padding:
const EdgeInsets.only(
top: 8.0),child: Column(
children: <Widget>[
Padding(
padding:
const EdgeInsets
.symmetric(
horizontal:
8.0),child: Container(
alignment:
Alignment.center,child: textCustom(
aktivitasNotifier
.listAktivitas[
index]
.nama,ClipRRect(
borderRadius:
BorderRadius.circular(10),child: InkWell(
onTap: () => Navigator.of(
context)
.push(CupertinoPageRoute(
builder: (BuildContext
context) =>
ProfilAgenWisata(
nama: aktivitasNotifier
.listAktivitas[
index]
.nama,website: aktivitasNotifier
.listAktivitas[
index]
.website,noTelepon: aktivitasNotifier
.listAktivitas[
index]
.noTelepon,email: aktivitasNotifier
.listAktivitas[
index]
.email,alamat: aktivitasNotifier
.listAktivitas[
index]
.alamat,deskripsi: aktivitasNotifier
.listAktivitas[
index]
.deskripsi,child: Container(
alignment: Alignment.center,child: textCustom(
'Detail',)
],);
},));
}
}