将示例数据转换为真实的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(

试图在我的应用程序中应用自定义infowindows,我遵循了一个教程,其中包含示例数据,但我无法将示例转换到我的实际应用程序中,我需要用我自己的json获取数据替换教程中的示例硬编码数据

这是教程示例数据:

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;
}