将示例数据转换为真实的json数据
试图在我的应用程序中应用自定义infowindows,我遵循了一个教程,其中包含示例数据,但我无法将示例转换到我的实际应用程序中,我需要用我自己的json获取数据替换教程中的示例硬编码数据 这是教程示例数据:将示例数据转换为真实的json数据,json,flutter,provider,Json,Flutter,Provider,试图在我的应用程序中应用自定义infowindows,我遵循了一个教程,其中包含示例数据,但我无法将示例转换到我的实际应用程序中,我需要用我自己的json获取数据替换教程中的示例硬编码数据 这是教程示例数据: final Map<String, User> _userlist = { "spiderman": User('spiderman', 'Integral II', 'assets/images/logo.png', LatLng(
final Map<String, User> _userlist = {
"spiderman": User('spiderman', 'Integral II', 'assets/images/logo.png',
LatLng(18.47272120045281, -69.89471245478768), 4),
"ironman": User('ironman', 'Centro Médico', 'assets/images/logo.png',
LatLng(18.47790066554913, -69.89132199740789), 4),
};
我将包含完整的教程文件,以备您查看:
import 'package:clippy_flutter/clippy_flutter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../model/infowindow.dart';
import '../model/user.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
class CustomInfowindow extends StatefulWidget {
@override
_CustomInfowindowState createState() => _CustomInfowindowState();
}
class _CustomInfowindowState extends State<CustomInfowindow> {
GoogleMapController mapController;
Set<Marker> _markers = Set<Marker>();
final LatLng _center = LatLng(18.47272120045281, -69.89471245478768);
final double _zoom = 15.0;
final Map<String, User> _userlist = {
"spiderman": User('spiderman', 'Integral II', 'assets/images/logo.png',
LatLng(18.47272120045281, -69.89471245478768), 4),
"ironman": User('ironman', 'Centro Médico', 'assets/images/logo.png',
LatLng(18.47790066554913, -69.89132199740789), 4),
};
final double _infoWindowWidth = 250;
final double _markerOffset = 170;
@override
Widget build(BuildContext context) {
final providerObject = Provider.of<InfoWindowModel>(context, listen: false);
_userlist.forEach((key, value) {
_markers.add(
Marker(
markerId: MarkerId(value.username),
position: value.location,
onTap: () {
providerObject.updateInfowindow(context, mapController,
value.location, _infoWindowWidth, _markerOffset);
providerObject.updateUser(value);
providerObject.updateVisibility(true);
providerObject.rebuildInfowindow();
}),
);
});
return Scaffold(
appBar: AppBar(
title: Text('Sistema de Citas'),
backgroundColor: Colors.blue,
),
body: Container(
child: Consumer<InfoWindowModel>(
builder: (context, model, child) {
return Stack(
children: [
child,
Positioned(
left: 0,
top: 0,
child: Visibility(
visible: providerObject.showInfoWindow,
child: (providerObject.user == null ||
!providerObject.showInfoWindow)
? Container()
: Container(
margin: EdgeInsets.only(
left: providerObject.leftMargin,
top: providerObject.topMargin),
child: Expanded(
child: Column(
children: [
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(5.0),
gradient: LinearGradient(
colors: [
Colors.white,
Color(0xfffceef5),
],
end: Alignment.bottomCenter,
begin: Alignment.topCenter,
),
boxShadow: [
BoxShadow(
color: Colors.grey,
offset: Offset(0.0, 1.0),
blurRadius: 6.0,
)
]),
height: 115,
width: 250,
padding: EdgeInsets.all(15.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Image.asset(
providerObject.user.image,
height: 75,
),
SizedBox(
width: 10.0,
),
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
providerObject.user.name,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black),
),
IconTheme(
data: IconThemeData(
color: Colors.red,
size: 18,
),
child: Row(
children: List.generate(5,
(index) {
return Icon(
index <
providerObject
.user.rating
? Icons.star
: Icons.star_border,
);
})),
),
// ignore: deprecated_member_use
FlatButton(
onPressed: () {},
child: Text("Hacer Cita"),
color: Colors.blue,
textColor: Colors.white,
)
],
)
],
),
),
Triangle.isosceles(
edge: Edge.BOTTOM,
child: Container(
color: Color(0xfffceef5),
width: 20.0,
height: 15.0,
),
)
],
),
),
),
))
],
);
},
child: Positioned(
child: GoogleMap(
onTap: (position) {
if (providerObject.showInfoWindow) {
providerObject.updateVisibility(false);
providerObject.rebuildInfowindow();
}
},
onCameraMove: (position) {
if (providerObject.user != null) {
providerObject.updateInfowindow(
context,
mapController,
providerObject.user.location,
_infoWindowWidth,
_markerOffset);
providerObject.rebuildInfowindow();
}
},
onMapCreated: (GoogleMapController controller) {
mapController = controller;
},
markers: _markers,
initialCameraPosition: CameraPosition(
target: _center,
zoom: _zoom,
),
),
),
),
),
);
}
}
import'package:clippy_flatter/clippy_flatter.dart';
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“../model/infowindow.dart”;
导入“../model/user.dart”;
导入“包:google_-maps_-flatter/google_-maps_-flatter.dart”;
类CustomInfowindow扩展StatefulWidget{
@凌驾
_CustomInfoWindowsState createState();
}
类_customInfoWindowsState扩展状态{
谷歌地图控制器;
Set _markers=Set();
最终车床加工中心=车床加工中心(18.4727220045281,-69.89471245478768);
最终双倍放大=15.0;
最终映射_userlist={
“蜘蛛侠”:用户('spiderman'、'Integral II'、'assets/images/logo.png',
LatLng(18.47272120045281,-69.89471245478768),4),
“铁人”:用户('ironman'、'Centro Médico'、'assets/images/logo.png',
LatLng(18.47790066554913,-69.89132199740789),4,
};
最终双窗口宽度=250;
最终双标记偏移=170;
@凌驾
小部件构建(构建上下文){
final providerObject=Provider.of(上下文,侦听:false);
_forEach((键,值){
_markers.add(
标记(
markerId:markerId(value.username),
位置:value.location,
onTap:(){
providerObject.UpdateInfo窗口(上下文、mapController、,
value.location,_infoWindowWidth,_markerOffset);
providerObject.updateUser(值);
providerObject.UpdateVibility(true);
providerObject.rebuildInfowindow();
}),
);
});
返回脚手架(
appBar:appBar(
标题:文本(“Sistema de Citas”),
背景颜色:Colors.blue,
),
主体:容器(
儿童:消费者(
生成器:(上下文、模型、子对象){
返回堆栈(
儿童:[
小孩
定位(
左:0,,
排名:0,
孩子:可见度(
可见:providerObject.showInfoWindow,
子级:(providerObject.user==null)||
!providerObject.showInfoWindow)
?容器()
:容器(
页边距:仅限边距(
左:providerObject.leftMargin,
顶部:providerObject.topMargin),
儿童:扩大(
子:列(
儿童:[
容器(
装饰:盒子装饰(
边界半径:
边界半径。圆形(5.0),
梯度:线性梯度(
颜色:[
颜色,白色,
颜色(0xfffceef5),
],
结束:对齐。底部中心,
开始:Alignment.topCenter,
),
boxShadow:[
箱形阴影(
颜色:颜色。灰色,
偏移量:偏移量(0.0,1.0),
半径:6.0,
)
]),
身高:115,
宽度:250,
填充:所有边缘设置(15.0),
孩子:排(
主轴对准:
MainAxisAlignment.start,
儿童:[
影像资产(
providerObject.user.image,
身高:75,
),
大小盒子(
宽度:10.0,
),
纵队(
横轴对齐:
CrossAxisAlignment.start,
儿童:[
正文(
providerObject.user.name,
样式:TextStyle(
尺寸:16,
fontWeight:fontWeight.bold,
颜色:颜色。黑色),
),
IconTheme(
数据:IconThemeData(
颜色:颜色,红色,
尺码:18,
),
孩子:排(
{
"id":"KPb8KINubNlpJy8sTGFA",
"calle":"Av. John F. Kennedy",
"sector":"UNPHU"
"longitude":"-69.94830718763",
"latitude":"18.48567087776",
"location":{
"_latitude":18.48567087776,
"_longitude":-69.94830718763
},
}
import 'package:clippy_flutter/clippy_flutter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../model/infowindow.dart';
import '../model/user.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
class CustomInfowindow extends StatefulWidget {
@override
_CustomInfowindowState createState() => _CustomInfowindowState();
}
class _CustomInfowindowState extends State<CustomInfowindow> {
GoogleMapController mapController;
Set<Marker> _markers = Set<Marker>();
final LatLng _center = LatLng(18.47272120045281, -69.89471245478768);
final double _zoom = 15.0;
final Map<String, User> _userlist = {
"spiderman": User('spiderman', 'Integral II', 'assets/images/logo.png',
LatLng(18.47272120045281, -69.89471245478768), 4),
"ironman": User('ironman', 'Centro Médico', 'assets/images/logo.png',
LatLng(18.47790066554913, -69.89132199740789), 4),
};
final double _infoWindowWidth = 250;
final double _markerOffset = 170;
@override
Widget build(BuildContext context) {
final providerObject = Provider.of<InfoWindowModel>(context, listen: false);
_userlist.forEach((key, value) {
_markers.add(
Marker(
markerId: MarkerId(value.username),
position: value.location,
onTap: () {
providerObject.updateInfowindow(context, mapController,
value.location, _infoWindowWidth, _markerOffset);
providerObject.updateUser(value);
providerObject.updateVisibility(true);
providerObject.rebuildInfowindow();
}),
);
});
return Scaffold(
appBar: AppBar(
title: Text('Sistema de Citas'),
backgroundColor: Colors.blue,
),
body: Container(
child: Consumer<InfoWindowModel>(
builder: (context, model, child) {
return Stack(
children: [
child,
Positioned(
left: 0,
top: 0,
child: Visibility(
visible: providerObject.showInfoWindow,
child: (providerObject.user == null ||
!providerObject.showInfoWindow)
? Container()
: Container(
margin: EdgeInsets.only(
left: providerObject.leftMargin,
top: providerObject.topMargin),
child: Expanded(
child: Column(
children: [
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(5.0),
gradient: LinearGradient(
colors: [
Colors.white,
Color(0xfffceef5),
],
end: Alignment.bottomCenter,
begin: Alignment.topCenter,
),
boxShadow: [
BoxShadow(
color: Colors.grey,
offset: Offset(0.0, 1.0),
blurRadius: 6.0,
)
]),
height: 115,
width: 250,
padding: EdgeInsets.all(15.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Image.asset(
providerObject.user.image,
height: 75,
),
SizedBox(
width: 10.0,
),
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
providerObject.user.name,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black),
),
IconTheme(
data: IconThemeData(
color: Colors.red,
size: 18,
),
child: Row(
children: List.generate(5,
(index) {
return Icon(
index <
providerObject
.user.rating
? Icons.star
: Icons.star_border,
);
})),
),
// ignore: deprecated_member_use
FlatButton(
onPressed: () {},
child: Text("Hacer Cita"),
color: Colors.blue,
textColor: Colors.white,
)
],
)
],
),
),
Triangle.isosceles(
edge: Edge.BOTTOM,
child: Container(
color: Color(0xfffceef5),
width: 20.0,
height: 15.0,
),
)
],
),
),
),
))
],
);
},
child: Positioned(
child: GoogleMap(
onTap: (position) {
if (providerObject.showInfoWindow) {
providerObject.updateVisibility(false);
providerObject.rebuildInfowindow();
}
},
onCameraMove: (position) {
if (providerObject.user != null) {
providerObject.updateInfowindow(
context,
mapController,
providerObject.user.location,
_infoWindowWidth,
_markerOffset);
providerObject.rebuildInfowindow();
}
},
onMapCreated: (GoogleMapController controller) {
mapController = controller;
},
markers: _markers,
initialCameraPosition: CameraPosition(
target: _center,
zoom: _zoom,
),
),
),
),
),
);
}
}
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:gabinete/jsonProvider.dart';
import 'package:gabinete/screens/listar_centros.dart';
import 'package:gabinete/widget/header_widget.dart';
import 'package:geocoder/geocoder.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
class JsonPage extends StatefulWidget {
static const routeName = '/json';
@override
_JsonPageState createState() => _JsonPageState();
}
class _JsonPageState extends State<JsonPage>
with AutomaticKeepAliveClientMixin {
Future res;
GoogleMapController _mapController;
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
BitmapDescriptor myIcon;
@override
Widget build(BuildContext context) {
super.build(context);
return MaterialApp(
initialRoute: '/',
routes: {
'/lista-centros': (context) => ListadoCentros(),
},
debugShowCheckedModeBanner: false,
title: 'GABINETE SALUD',
theme: ThemeData(
primaryColor: Colors.blue[900],
),
home: SafeArea(
child: Scaffold(
body: Container(
//color: Colors.grey[200],
color: Colors.white,
child: Column(
children: <Widget>[
HeaderWidget(),
SizedBox(height: 10),
Expanded(
child: GoogleMap(
markers: Set<Marker>.of(markers.values),
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: LatLng(18.5082205, -69.8240024), zoom: 12.0),
onMapCreated: _onMapCreated,
zoomControlsEnabled: true,
myLocationEnabled: true,
myLocationButtonEnabled: true,
),
),
],
),
),
),
),
);
}
getMarkerData() async {
var myList = await ApiProvider().getData();
List jsonParsed = json.decode(myList.toString());
if (jsonParsed == null) {
return CircularProgressIndicator();
} else {
for (int i = 0; i < jsonParsed.length; i++) {
initMarker(jsonParsed[i], jsonParsed[i]['id']);
}
}
}
void initMarker(specify, specifyId) async {
var markerIdVal = specifyId;
final MarkerId markerId = MarkerId(markerIdVal);
double latitude = specify['location']['_latitude'];
double longitude = specify['location']['_longitude'];
final Marker marker = Marker(
icon: myIcon,
markerId: markerId,
position: LatLng(latitude, longitude),
infoWindow: InfoWindow(
title: 'Centro',
snippet: specify['calle'] + ' ' + specify['sector']));
setState(() {
markers[markerId] = marker;
});
_placeMyIcon();
}
void _onMapCreated(GoogleMapController controller) {
_mapController = controller;
_centerView();
}
void initState() {
BitmapDescriptor.fromAssetImage(
ImageConfiguration(size: Size(15, 15)), 'assets/images/logo.png')
.then((onValue) {
myIcon = onValue;
});
getMarkerData();
super.initState();
}
_placeMyIcon() async {
Location location = Location();
double lat;
double lon;
final MarkerId markerId = MarkerId('yo');
var locData = await location.getLocation();
lat = locData.latitude;
lon = locData.longitude;
final Marker marker = Marker(
markerId: MarkerId('SomeId'),
position: LatLng(lat, lon),
zIndex: 100,
infoWindow: InfoWindow(title: 'Yo'));
setState(() {
markers[markerId] = marker;
});
}
_centerView() async {
Location location = Location();
double lat;
double lon;
var locData = await location.getLocation();
lat = locData.latitude;
lon = locData.longitude;
double zoomLevel = await _mapController.getZoomLevel();
var cameraUpdate = CameraUpdate.newCameraPosition(
CameraPosition(target: LatLng(lat, lon), zoom: zoomLevel));
_mapController.animateCamera(cameraUpdate);
}
@override
bool get wantKeepAlive => true;
}