Flutter Geolocator 显示方法 toDouble() 在 null 上被调用

Posted

技术标签:

【中文标题】Flutter Geolocator 显示方法 toDouble() 在 null 上被调用【英文标题】:Flutter Geolocator showing the method toDouble() was called on null 【发布时间】:2021-06-25 18:22:28 【问题描述】:

我在 Flutter 中遇到 Geolocator 插件问题。错误显示 toDouble() 被调用为 null。该应用程序从 Firebase 获取纬度和经度,并计算相对于用户距离的距离。数据加载并正确计算距离,但仅在移动设备中显示红色屏幕之后。 Image of error log here

下面是我的代码

import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:e_commerce/Screen/HomeContent/HomeList/getdata.dart';
import 'package:e_commerce/Screen/HomeContent/HomeList/locationProvider.dart';
import 'package:e_commerce/Services/TestDirection/getCurrentLocation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:geolocator/geolocator.dart';
import 'package:location/location.dart';
import 'package:sortedmap/sortedmap.dart';

class TestUI extends StatefulWidget 
  const TestUI(Key key) : super(key: key);

  @override
  _TestUIState createState() => _TestUIState();


class _TestUIState extends State<TestUI> 
  BusinessServices _businessServices = BusinessServices();
  var _userLatitude;
  var _userLongitude;

  _getCurrentLocation() async 
    var locate = await Geolocator.getCurrentPosition();
    setState(() 
      _userLatitude = locate.latitude;
      _userLongitude = locate.longitude;
    );
  

  @override
  void initState() 
    super.initState();
    _getCurrentLocation();
  

  String getDistance(location) 
    var distance = Geolocator.distanceBetween(
        _userLatitude, _userLongitude, location.latitude, location.longitude);

    var distanceInKm = distance / 1000;
    return distanceInKm.toStringAsFixed(2);
  

  @override
  Widget build(BuildContext context) 
    return Container(
      child: StreamBuilder<QuerySnapshot>(
        stream: _businessServices.getBusiness(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapShot) 
          if (!snapShot.hasData)
            return CircularProgressIndicator();
          else 
            return Column(
              children: [
                Flexible(
                  child: ListView(
                    shrinkWrap: true,
                    scrollDirection: Axis.vertical,
                    children:
                        snapShot.data.docs.map((DocumentSnapshot document) 
                      if (double.parse(getDistance(document['location'])) <=
                          10) 
                        return Padding(
                          padding: const EdgeInsets.all(4.0),
                          child: Card(
                            margin: EdgeInsets.only(
                              left: 10,
                              right: 10,
                              top: 5,
                              bottom: 5,
                            ),
                            child: Container(
                              child: Column(
                                children: [
                                  SizedBox(
                                      width: double.infinity,
                                      height: 100,
                                      child: CachedNetworkImage(
                                        imageUrl: document['image'],
                                        fit: BoxFit.cover,
                                      )),
                                  ListTile(
                                      subtitle: ListView(
                                          shrinkWrap: true,
                                          physics:
                                              NeverScrollableScrollPhysics(),
                                          children: [
                                            RatingBarIndicator(
                                              rating:
                                                  document["rating"].toDouble(),
                                              itemBuilder: (context, index) =>
                                                  const Icon(
                                                Icons.star,
                                                color: Colors.amber,
                                              ),
                                              itemCount: 5,
                                              itemSize: 18.0,
                                              direction: Axis.horizontal,
                                            ),
                                          ]),
                                      title: Row(
                                        mainAxisAlignment:
                                            MainAxisAlignment.spaceBetween,
                                        children: [
                                          Text(document['name']),
                                          Text(
                                              "$getDistance(document['location']) km",
                                              style: TextStyle(
                                                  fontSize: 14,
                                                  color: Colors.blueGrey[700])),
                                        ],
                                      )),
                                ],
                              ),
                            ),
                          ),
                        );
                       else 
                        return Container();
                      
                    ).toList(),
                  ),
                ),
              ],
            );
          
        ,
      ),
    );
  

【问题讨论】:

【参考方案1】:

首先,这里很多东西看起来都错了,避免使用动态类型,你的位置参数应该是位置类型但不是,你知道什么类型的数据存储在你的火库中用于位置.. .我的猜测是它的地理点所以你得到一个合适的地理点吗?而且我认为主要问题是评级..彻底检查。

【讨论】:

实际上评级不是它以前工作的问题,但现在当我添加地理定位器时,这个异常来了,我想你知道是什么导致了错误,它是因为 _userlatitude 和 _userlongitude 起初为空,但我没有知道如何解决它 @IhsanAhmed 做一件事,只给它们一个默认值,或者只显示一些加载指示器,直到加载该值。或者,像 _userlatitude??somedefaultlat... 一样使用它,或者像 if(userlatitude==null) 这样的加载指示器 return loadingwidget();否则返回 contentWidget();

以上是关于Flutter Geolocator 显示方法 toDouble() 在 null 上被调用的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Geolocator返回方法'compareTo'在null上被调用

未找到 Flutter 插件“geolocator-Swift.h”文件

使用 geolocator 和 provider 以及 flutter_maps 获取位置

Flutter Geolocator给出错误的纬度和经度

Flutter Geolocator 无法在 Android 上运行,但可以在 iOS 上完美运行

Flutter geolocator 包在 IOS 应用程序上给出负纬度,在 Android 上给出正确坐标