Ошибка noSuchMethod: Получатель «имя» был вызван при нулевом значении

#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)
 

вместо