Android Firebase报错Can't pass null for argument 'pathString' in child()求助
问题根因
你的崩溃是三个逻辑错误共同导致的:
- 实例化的
Usuario对象未初始化id字段:你在MapsActivity中直接调用new Usuario()创建实例后,没有调用setId()给id字段赋值,调用usuario.recuperarId()时,方法内部执行getId()返回的就是null,传入Firebase的child()方法直接触发空指针异常。 recuperarId()方法逻辑完全错误:Firebase数据库的get()操作是异步执行的,你在异步回调还没返回结果的时候就直接返回idSalvo,此时idSalvo还未被赋值,必然返回null。而且该方法本身设计多余,当前登录用户的唯一ID直接从FirebaseAuth就能获取,不需要额外查询实时数据库。- 位置保存逻辑顺序错误:你在
onMapReady中直接调用localizacao.salvarLocalizacao()时,用户位置还未通过定位回调拿到,就算id问题解决了,也会出现经纬度为空的问题。
修复方案
1. 移除冗余逻辑
删掉Usuario类中没用的recuperarId()方法,该逻辑完全没有存在必要。
2. 直接从FirebaseAuth获取用户ID
当前已登录用户的唯一ID直接通过FirebaseAuth实例获取即可,不需要查询数据库,修改MapsActivity的onMapReady方法如下:
@Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 先校验用户登录状态,未登录直接返回 FirebaseUser currentUser = autenticacao.getCurrentUser(); if(currentUser == null){ finish(); return; } // 直接获取登录用户uid赋值 localizacao.setId(currentUser.getUid()); // 启动定位 recuperarLocalizacaoUsuario(); }
3. 调整位置保存的触发时机
在定位成功的回调里执行位置保存操作,保证经纬度有值,修改recuperarLocalizacaoUsuario方法里的onLocationChanged逻辑:
@Override public void onLocationChanged(@NonNull Location location) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); localizacaoAtual = new LatLng(latitude, longitude); localizacao.setLatitude(String.valueOf(localizacaoAtual.latitude)); localizacao.setLongitude(String.valueOf(localizacaoAtual.longitude)); // 新增:定位成功后再保存位置信息 localizacao.salvarLocalizacao(); clicarMapa(); mMap.clear(); mMap.addMarker( new MarkerOptions() .position(localizacaoAtual) .title("Meu local") .icon(BitmapDescriptorFactory.fromResource(R.drawable.usuario)) ); mMap.moveCamera( CameraUpdateFactory.newLatLngZoom(localizacaoAtual, 15) ); }
修改完成后即可解决崩溃问题。
内容的提问来源于stack exchange,提问作者X MrZaq X
相关产品推荐
相关产品推荐

