我收到了这个错误,但找不到原因,该应用程序显示了一个从谷歌地图调用医院的谷歌地图,当在chrome中使用时,api调用返回良好,但该应用程序无法构建,显示"NoSuchMethodError:Thegetter'length'was called on null"错误。谢谢你的帮助。
class Search extends StatelessWidget {
@override
Widget build(BuildContext context) {
final currentPosition = Provider.of<Position>(context);
final placesProvider = Provider.of<Future<List<Place>>>(context);
return FutureProvider(
create: (context) => placesProvider,
child: Scaffold(
body: (currentPosition != null)
? Consumer<List<Place>>(
builder: (_, places, __) {
return Column(
children: <Widget>[
Container(
height: MediaQuery.of(context).size.height / 3,
width: MediaQuery.of(context).size.width,
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(currentPosition.latitude,
currentPosition.longitude),
zoom: 16.0),
zoomGesturesEnabled: true,
mapToolbarEnabled: true,
myLocationEnabled: true,
scrollGesturesEnabled: true,
),
),
SizedBox(
height: 10.0,
),
Expanded(
child: ListView.builder(
itemCount: places.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text(places[index]?.name),
),
);
}),
)
],
);
},
)
: Center(
child: CircularProgressIndicator(),
),
),
);
}
}
在chrome中调用api请求时工作正常,问题是在构建应用程序时。这是我的places_service.dart文件:
class PlacesService {
final key = 'xxxxxxxxxxxxxxxxxxxxx-ttttttttttttttttt';
Future<List<Place>> getPlaces(double lat, double lng) async {
var response = await http.get('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=$lat,$lng&type=hospital&rankby=distance&key=$key');
var json = convert.jsonDecode(response.body);
var jsonResults = json['results'] as List;
return jsonResults.map((place) => Place.fromJson(place)).toList();
}
}
问题是这条线:
itemCount: places.length,
如果使用places.length
这样的构造,编程代码可能会在两个地方失败:
- 当
places = null
- 当
places.length = null
(您的情况(
不能在null对象上调用方法和属性;这就是为什么你会出现这个错误。因此,在调用places.length
之前,必须确保这两种情况都不会发生。如何做到这一点,以及检查是否真的有必要,取决于程序的其余部分。一种检查方法是:
itemCount: places.length != null ? places.length : 0;