#flutter
Вопрос:
Приведенный ниже код выполняет поиск парковки в базе данных, в которой присутствует пользователь. Если один из них не может быть найден (т. Е. пользователь не находится рядом ни с одной автостоянкой в базе данных), установите его на парковку «Главная». Однако возникает следующая ошибка:
Похоже, что следующий код не работает:
Пожалуйста, помогите. Большое спасибо.
String currentScreen = 'myLocation';
double latitude = 0;
double longitude = 0;
class MyLocationScreen extends StatefulWidget {
static const String id = '/myLocationScreen';
@override
_MyLocationScreenState createState() => _MyLocationScreenState();
}
class _MyLocationScreenState extends State<MyLocationScreen> {
List<Carpark> carparkList = []; //List for storing carparks
Carpark nearbyCarpark;
LocationData _currentPosition;
GoogleMapController mapController;
Location location = Location();
GoogleMapController _controller;
LatLng _initialcameraposition = LatLng(22.35278, 114.18527);
@override
void initState() {
super.initState();
}
Future readFromFirebase2() async {
print('reading from Firebase');
Carpark _thisCarpark;
List<Carpark> _carparkList = [];
Provider.of<CarparksProvider>(context, listen: false).clearCarparks();
// await FirebaseFirestore.instance
await FirebaseFirestore.instance
.collection('carpark')
.orderBy('region')
.orderBy('district')
.orderBy('name')
.get()
.then((QuerySnapshot snapshot) {
snapshot.docs.forEach(
(DocumentSnapshot cp) {
_thisCarpark = Carpark(
cp.get('name'),
cp.get('region'),
cp.get('district'),
cp.get('lat'),
cp.get('long'),
cp.get('fee1'),
cp.get('fee2'),
cp.get('remark'),
cp.get('url'),
);
Provider.of<CarparksProvider>(context, listen: false)
.addCarpark(_thisCarpark);
},
);
_carparkList =
Provider.of<CarparksProvider>(context, listen: false).carparks;
_carparkList.forEach((carpark) {
});
});
carparkList = _carparkList;
}
void _onMapCreated(GoogleMapController _cntlr) {
_controller = _cntlr;
location.onLocationChanged.listen((l) {
_controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(target: LatLng(l.latitude, l.longitude), zoom: 15),
),
);
});
}
double distanceBetween(double x1, double y1, double x2, double y2) {
double distance =
pow((pow((x1 - x2), 2.0) pow((y1 - y2), 2.0)), 0.5) * 100.0;
print('distance: ' distance.toStringAsFixed(1) 'km');
return distance;
}
void getCurrentCarpark() {
Carpark _nearbyCarpark;
for (Carpark cp in carparkList) {
print(cp.name);
if (distanceBetween(cp.lat, cp.long, latitude, longitude) < 1) {
// distance within 1km
_nearbyCarpark = cp;
}
}
if (_nearbyCarpark = null) {
//If the current location is one of the carparks in the database, set 'Home' as the current carpark
_nearbyCarpark =
carparkList.firstWhere((carpark) => carpark.name == 'Home');
}
nearbyCarpark = _nearbyCarpark;
}
void getCurrentLoc() async {
bool _serviceEnabled;
PermissionStatus _permissionGranted;
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
return;
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
_permissionGranted = await location.requestPermission();
if (_permissionGranted != PermissionStatus.granted) {
return;
}
}
_currentPosition = await location.getLocation();
latitude = _currentPosition.latitude;
longitude = _currentPosition.longitude;
print(latitude);
print(longitude);
_initialcameraposition =
LatLng(_currentPosition.latitude, _currentPosition.longitude);
location.onLocationChanged.listen((LocationData currentLocation) {
setState(() {
_currentPosition = currentLocation;
_initialcameraposition =
LatLng(_currentPosition.latitude, _currentPosition.longitude);
});
});
}
Future<void> initialisation() async {
await readFromFirebase2();
getCurrentLoc();
getCurrentCarpark();
}
@override
Widget build(BuildContext context) {
initialisation();
return Scaffold(
body: FutureBuilder(
future: readFromFirebase2(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
return Column(
children: [
Expanded(
flex: 5,
child: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: GoogleMap(
initialCameraPosition:
CameraPosition(target: _initialcameraposition),
mapType: MapType.normal,
onMapCreated: _onMapCreated,
myLocationEnabled: true,
),
),
),
Text(
nearbyCarpark.name,
style: knearbyCarparkTextStyle,
),
SizedBox(
width: 200,
child: ElevatedButton(
onPressed: () {
// Code for link to current carpark
},
child: Text(
'Car park Fee',
style: kCarparkTextStyle,
),
),
),
],
);
}),
);
}
}
Комментарии:
1. Я дважды проверил, и все элементы не являются пустыми……
2. убедитесь, что вы используете _nearbyCarpark != null не _nearbyCarpark = null.
Ответ №1:
Если вы возьмете весь код, то
if (_nearbyCarpark = null) {
//If the current location is one of the carparks in the database, set 'Home' as the current carpark
_nearbyCarpark =
carparkList.firstWhere((carpark) => carpark.name == 'Home');
}
nearbyCarpark = _nearbyCarpark;
ошибка, ошибка в условии (это довольно тонко):
if (_nearbyCarpark = null)
является заданием ( =
), а не сравнением (что было бы ==
). Поэтому мне интересно, как это вообще компилируется (у меня нет такого опыта с Dart, но я почти уверен , что при выполнении это if (condition)
condition
должно быть a bool
). Если он действительно компилируется, это будет эквивалентно
if (null) {
...
}
что, вероятно, даже не привело бы к смерти тела. Кроме того, помните, что вы установили _nearbyCarpark
значение в null
пределах условия, поэтому при настройке
nearbyCarpark = _nearbyCarpark
после if
этого , вероятно, происходит какая-то привязка данных, потому что вы устанавливаете ее источник данных null
равным …
Так что вам, вероятно, нужно сделать
if (_nearbyCarpark == null)
вместо