Получить маркер из файла JSON и показать в GoogleMap - PullRequest
0 голосов
/ 19 мая 2019

Я делаю простое приложение, получаю маркер данных из файла JSON и рисую их в GoogleMap.

Я получил информацию о маркере из файла и добавил ее в список allMarkers.

Но когда я запускаю свое приложение, оно только рисует карту, а не показывает маркер и получает уведомление консоли:

flutter: Another exception was thrown: A build function returned null.

Это мой полный main.dartкод

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future _future;

  Future<String> loadString() async =>
      await rootBundle.loadString('assets/data.json');
  List<Marker> allMarkers = [];
  GoogleMapController _controller;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _future = loadString();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(children: [
        Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: Stack(children: <Widget>[
            FutureBuilder(
              future: _future,
              builder: (context, AsyncSnapshot snapshot) {
                List<dynamic> parsedJson = jsonDecode(snapshot.data);
                allMarkers = parsedJson.map((element) {
                  return Marker(
                      markerId: MarkerId(element['id']),
                      position: LatLng(element['x'], element['y']));
                }).toList();
              },
            ),
            GoogleMap(
              initialCameraPosition:
                  CameraPosition(target: LatLng(40.7128, -74.0060), zoom: 1.0),
              markers: Set.from(allMarkers),
              onMapCreated: mapCreated,
            ),
          ]),
        ),
      ]),
    );
  }
  void mapCreated(controller) {
    setState(() {
      _controller = controller;
    });
  }
}

и мой data.json (только для теста)

[{
    "id": "8D5D-4CD323560F59",
    "x": 40.7128,
    "y": -74.0060
 },{
    "id": "E3E0D2C5-CB82",
    "x": 41.7128,
    "y": -75.0060
 }]

1 Ответ

4 голосов
/ 19 мая 2019

Я не знаю, почему вы используете Stack, но вам не нужно, насколько это кажется.

Добавление условия внутри FutureBuilder всегда должно быть, как мой пример ниже.

Внутри FutureBuilder(builder: () => Widget) нет возвращаемого значения.В вашем случае вы просто выполняете некоторую логику, вам также нужно вернуть виджет.

Решение:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(children: [
        Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot snapshot) {
              if (!snapshot.hasData) {
                return CircularProgressIndicator();
              }
              List<dynamic> parsedJson = jsonDecode(snapshot.data);
              allMarkers = parsedJson.map((element) {
                return Marker(
                    markerId: MarkerId(element['id']),
                    position: LatLng(element['x'], element['y']));
              }).toList();

              return GoogleMap(
                initialCameraPosition: CameraPosition(
                    target: LatLng(40.7128, -74.0060), zoom: 1.0),
                markers: Set.from(allMarkers),
                onMapCreated: mapCreated,
              );
            },
          ),
        ),
      ]),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...