繁体   English   中英

lateinit 属性 mMap 尚未初始化 mMap

[英]lateinit property mMap has not been initialized mMap

Class 执行服务并初始化mMap:GoogleMap

class LocationServiceUser : Service(), OnMapReadyCallback {
    private val serviceScopeUser = CoroutineScope(SupervisorJob() + Dispatchers.IO)
    private lateinit var locationClient: LocationClientUser
    private val db = FirebaseFirestore.getInstance()
    private lateinit var mMap: GoogleMap
    private val markerOptions = MarkerOptions()

    override fun onBind(p0: Intent?): IBinder? {
        return null
    }

    override fun onCreate() {
        super.onCreate()
        locationClient = DefaultLocationClientUser(
            applicationContext,
            LocationServices.getFusedLocationProviderClient(applicationContext)
        )
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        when (intent?.action) {
            ACTION_READING_DATA -> readingData()
        }
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
    }

    fun readingData() {
        locationClient.getLocation(5000L)
            .catch { e -> e.printStackTrace() }
            .onEach { location ->
                var lat = location.latitude
                var lng = location.longitude
                var currentLatLng = LatLng(lat, lng)
                db.collection("").document("")
                    .addSnapshotListener { documentUser, error ->
                        if (documentUser != null) {
                            lat = documentUser.getGeoPoint("localizacao")?.latitude!!
                            lng = documentUser.getGeoPoint("localizacao")?.longitude!!
                            Log.d(
                                "Response",
                                "Dado lido a cada 5s:  lat: $lat, lng: $lng}"
                            )
                            currentLatLng = LatLng(lat, lng)
                        }
                        if (::mMap.isInitialized) {
                            mMap.addMarker(
                                MarkerOptions().position(currentLatLng)
                                    .title("Minha Localizacao atual")
                            )
                            Log.d("Response", "Minha localizacao de agora: $currentLatLng")
                        }else{
                            Log.d("Response", "readingData: Erro ao inicializar o mMap")
                        }
                        markerOptions.position(currentLatLng)
                        mMap.addMarker(markerOptions)
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLatLng))
                    }
            }.launchIn(serviceScopeUser)
    }

    override fun onDestroy() {
        super.onDestroy()
        serviceScopeUser.cancel()
    }

    companion object {
        const val ACTION_READING_DATA = "ACTION_READING_DATA"
    }

使用此服务的片段 class

class UserFragment: Fragment() {
    private var _binding: FragmentUserBinding? = null
    private val binding: FragmentUserBinding get() = _binding!!
    private lateinit var locationClientUser: LocationClientUser

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentUserBinding.inflate(inflater,container,false)

        return binding.root
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.startService(Intent(context,LocationServices::class.java))
        locationClientUser = DefaultLocationClientUser(
            requireContext().applicationContext,
            LocationServices.getFusedLocationProviderClient(requireContext().applicationContext)
        )
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.btnReadingData.setOnClickListener {
            Intent(
                requireContext().applicationContext,
                LocationServiceUser::class.java
            ).apply {
                action = LocationServiceUser.ACTION_READING_DATA
                activity?.startService(this)
            }
        }
    }

在服务中初始化 lateinit var mMap: GoogleMap 时出现问题,我知道在片段中启动是正常的,但我的服务具有我要更新的 loc 数据。 有没有办法在服务中初始化这个 lateinit var?

mMap.addMarker(markerOptions)
                
mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLatLng))

在此块中也添加这两行

if (::mMap.isInitialized) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM