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 获取位置