Было сгенерировано еще одно исключение: NoSuchMethodError: Получатель 'latitude' был вызван как ноль - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь использовать пакет Location во Flutter, но когда я пытаюсь отобразить в моем приложении значения широты и долготы, я получаю сообщение об ошибке: «Получатель« широта »был вызван как ноль». Возможно, что-то не так со службами определения местоположения на моем устройстве? Мне также предлагают всплывающее окно, когда я нажимаю на экран с надписью «Для лучшего опыта включите местоположение устройства, которое использует службу определения местоположения Google», но я уже включил разрешения для служб определения местоположения в приложении. Ниже мой код

import 'package:flutter/material.dart'; 
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:wasteagram/data/firestore_service.dart';
import 'package:location/location.dart'; 
import 'dart:async';
import 'package:wasteagram/model/user_location.dart'; 



class DetailPage extends StatefulWidget {

  final DocumentSnapshot post; 

  DetailPage({this.post}); 

  @override
  _DetailPageState createState() => _DetailPageState();
}

class _DetailPageState extends State<DetailPage> {

  LocationData locationData; 

  @override
  void initState() {
    super.initState(); 
    retrieveLocation(); 
  }

  void retrieveLocation() async {
    var locationService = Location(); 
    locationData = await locationService.getLocation(); 
    setState(() {

    });

  }

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.post.data["wastedate"])
      ), 
      body: Center(
        child: Container( 
          child: Column(
            children: <Widget> [
              Image.network(widget.post.data["image"]),
              Text(widget.post.data["wastedate"]), 
              Text(widget.post.data["wastenumber"]), 
              Text('Latitude: ${locationData.latitude}'),
              Text('Longitude: ${locationData.longitude}')

            ]
          )
        )
      ),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

попробуйте использовать будущий компоновщик для асинхронного обратного вызова метода c, например

FutureBuilder(
  future: retrieveLocation(),
  builder: (context, AsyncSnapshot snapshot) {
    if (snapshot.data == null) {
      return Center(child: CircularProgressIndicator());
    }
    return Center(
    child: Container( 
      child: Column(
        children: <Widget> [
          Image.network(widget.post.data["image"]),
          Text(widget.post.data["wastedate"]), 
          Text(widget.post.data["wastenumber"]), 
          Text('Latitude: ${locationData.latitude}'),
          Text('Longitude: ${locationData.longitude}')

        ]
      )
    )
  },
);

проблема в том, что ваш метод вызова вызывается до полного выполнения retrieveLocation()

0 голосов
/ 15 марта 2020

Вы пытаетесь получить доступ к широте до завершения вызова asyn c. Вы вызываете его на initState(), но метод завершается, вероятно, после выполнения функции build(), поэтому при попытке создать виджет Text('Latitude: ${locationData.latitude}') переменная locationData равна null. Быстрое решение состоит в том, чтобы установить значение по умолчанию locationData, но если вы хотите «дождаться» окончания метода retrieveLocation(), вы можете:

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.post.data["wastedate"])
      ), 
      body: Center(
        child: Container( 
          child: Column(
            children: <Widget> [
              Image.network(widget.post.data["image"]),
              Text(widget.post.data["wastedate"]), 
              Text(widget.post.data["wastenumber"]), 
              locationData!=null? Text('Latitude: ${locationData.latitude}') : Text('Waiting Latitude'),
              locationData!=null? Text('Longitude: ${locationData.longitude}') : Text('Waiting Longitude'),
            ]
          )
        )
      ),
    );
  }
...