如何在 FLUTTER 中杀死应用程序时将位置数据发送到 Firestore 数据库

Posted

技术标签:

【中文标题】如何在 FLUTTER 中杀死应用程序时将位置数据发送到 Firestore 数据库【英文标题】:How to send location data to Firestore Database when app is killed in FLUTTER 【发布时间】:2020-08-02 21:51:59 【问题描述】:

我一直在尝试在 Flutter 中创建一个应用程序,即使应用程序被杀死,它也会将用户的位置数据发送到 Firestore 数据库。

这个插件可以很好地在应用被杀死时获取位置数据: https://github.com/rekab-app/background_locator

问题是我无法在此插件的“回调”函数中更新 Firestore 数据库值

这是我的代码:

static void callback(LocationDto locationDto) async 
    print('location in dart: $locationDto.toString()');
    final SendPort send = IsolateNameServer.lookupPortByName(_isolateName);
    send?.send(locationDto);
    await DatabaseService(uid:UID).updateUserLocation(
            (locationDto.latitude).toString(),
            (locationDto.longitude).toString());

   

DatabaseService.updateUserLocation 方法是:

 Future updateUserLocation(String latitude,String longitude) async
  
    return await location_collection.document(uid).setData(
      'Longitude':longitude,
      'Latitude':latitude
    );
  

错误在于将 locationDto 发送到 FireStore 数据库 确切的错误是:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method DocumentReference#setData on channel plugins.flutter.io/cloud_firestore)

这与 updateUserLocation 方法中的 setData() 函数有关。

即使应用程序被杀死,如何将用户的位置数据发送到我的 Firestore 数据库?

如果有人可以帮助我,那就太好了!!!

谢谢!

【问题讨论】:

使用 Firebase Cloud Messaging 向您的应用发送推送通知。将启动您的应用以接收消息。 该应用程序适用于货车司机,因此当通知到达时他们可能无法打开该应用程序。您能否建议一种在应用程序被终止时将用户位置发送到 Firestore 的方法。谢谢! @ManasBam 你找到解决办法了吗? 【参考方案1】:

我在获得令牌时遇到了与 shared_preferences 相同的情况。所以,我认为在回调方法中创建一个新实例,并且可以工作。我的意思是,尝试像新对象一样在回调方法中调用 location_collection。

并在应用程序中添加了这个

override fun registerWith(registry: PluginRegistry?) 
       if (!registry!!.hasPlugin("io.flutter.plugins.sharedpreferences")) 
            SharedPreferencesPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.sharedpreferences"))
        
    

【讨论】:

【参考方案2】:

要使用 Firestore,您应该将这些行添加到 Application.kt。


import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.pathprovider.PathProviderPlugin
// Add this line
import io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin;
import io.flutter.view.FlutterMain
import rekab.app.background_locator.LocatorService

class Application : FlutterApplication(), PluginRegistrantCallback 
    override fun onCreate() 
        super.onCreate()
        LocatorService.setPluginRegistrant(this)
        FlutterMain.startInitialization(this)
    

    override fun registerWith(registry: PluginRegistry?) 
        if (!registry!!.hasPlugin("io.flutter.plugins.pathprovider")) 
            PathProviderPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.pathprovider"))
        
// Add this section
        if (!registry!!.hasPlugin("io.flutter.plugins.firebase.firestore")) 
CloudFirestorePlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebase.firestore"))
        
        
    

它对我有用。让我知道它是否也适合你。

【讨论】:

以上是关于如何在 FLUTTER 中杀死应用程序时将位置数据发送到 Firestore 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Flutter(Dart)如何在点击应用程序时将副本添加到剪贴板?

即使应用程序处于终止状态或被杀死,如何在 iOS 中获取位置更新? [复制]

Flutter 导航破坏和杀死页面值

即使在应用程序被杀死后如何继续进行 iOS 位置跟踪?

当应用程序被杀死时,无法在推送通知单击时导航到特定屏幕(Flutter android)

运行bash命令并在超过特定时间时将其杀死[重复]