小编Ant*_*tte的帖子

如何在flutter插件中使用接收器(BroadcastReceiver)?

问题

我正在构建一个需要 Radar.io SDK 某些功能的应用程序,因此我决定创建插件,以便在该项目结束后我可以与 Flutter 社区的其他成员共享该插件。问题是,我无法接收此插件中的事件。这对于插件很重要,因为为了接收地理定位触发器和其他后台事件等事件,该接收器需要接收实时信息。

我已经成功实现了https://radar.io/documentation/sdk中的 Android SDK(使用 Kotlin)中的每个功能,但是,当事件发生时,接收器不会被调用。我知道设备正在被跟踪,因为 Radar.io 仪表板中的位置已更新,但是,当发生各种事件时,接收器根本不会执行。

我尝试过的

以下是文档告诉您如何在清单中注册接收器的方法。

  <receiver
      android:name=".MyRadarReceiver"
      android:enabled="true"
      android:exported="false">
      <intent-filter>
          <action android:name="io.radar.sdk.RECEIVED" />
      </intent-filter>
  </receiver>
Run Code Online (Sandbox Code Playgroud)

这适用于标准应用程序,但是,当我在清单中注册接收器时,应用程序不会在接收器所在的插件目录中查找。相反,它会查找应用程序 android 目录并返回无法找到数据路径的错误。这会导致应用程序终止。

为了解决这个问题,我发现可以通过编程方式设置接收器,所以我决定尝试一下。

在插件的主 Kotlin 文件中,我编写了以下几行以在registerWithonAttachedToEngine. 据我了解,这些基本上是 onStart 函数。registerWith是为了与旧设备兼容而保留的旧功能。

val myRadarReceiver = MyRadarReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction("io.radar.sdk.RECEIVED")
ContextWrapper(this.context).registerReceiver(myRadarReceiver, intentFilter)
Run Code Online (Sandbox Code Playgroud)

引用的类是SDK 中类MyRadarReceiver()的扩展,它扩展意味着这是我的广播接收器。这是课程:RadarReceiverBroadcastReceiver

public class MyRadarReceiver: RadarReceiver() {

  override fun onEventsReceived(context: Context, events: Array<RadarEvent>, user: RadarUser) {
    println("test: " + "an event was received") …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver kotlin flutter flutter-plugin

7
推荐指数
2
解决办法
1万
查看次数

如何在一个 ListView 中使用多个 StreamBuilder

所以我正在做一个项目,我希望有一个包含多个数据流的列表视图。我正在寻找的是这样的东西,但它都需要在一个列表视图中滚动。

我收到的数据流来自 firebase,变量myData是 firebase 集合的一个实例。我能够构建单个流的一个列表,所以我知道实例是正确的,我不想共享它,因为数据库规则目前处于测试模式。

流列表

此代码允许我ListView从单个流构建一个并按预期工作。

Container(
  child: StreamBuilder<QuerySnapshot>(
  stream: myData,
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasError)
      return new Text('Error: ${snapshot.error}');
    switch (snapshot.connectionState) {
      case ConnectionState.waiting: return new Text('Loading...');
      default:
        return new ListView(
          children: snapshot.data.documents.map((DocumentSnapshot document) {
            return Text(document['color']);
          }).toList(),
        );
      }
    },
  ),
);
Run Code Online (Sandbox Code Playgroud)

从这里开始,我觉得我有 2 个选择,它们是:1)ColumnStreamBuilder允许我在一个ListView. 2) 或者将一个List空的放在 ListView 的子项中,并使用 StreamBuilder 以外的其他东西从 firebase 添加到列表中,因为它需要返回的小部件。(事实是我不知道除了 StreamBuilder 之外的另一种方式)任何想法都会受到欢迎。

这是我第一个想法的代码。我希望你能看到这将如何扩展。通过返回 Columns 我可以建立一种流体ListView。这样做的问题是它不会从 Firebase 获取数据,唯一的结果是CircularProgressIndicator …

dart flutter google-cloud-firestore

6
推荐指数
1
解决办法
2869
查看次数

Firebase Storage 和 Dropzone.js 按下按钮时上传多个图像

本质上我想做的是允许人们添加文件,然后按下按钮将图像上传到 Firebase 存储。我决定使用 Dropzone.js,因为该包编写良好且可自定义,但我仍然感到困惑。

我有这段代码,允许我将多个图像上传到 Firebase,但是,我希望它适合此代码下面所示的框架:

超文本标记语言

<input type="file" id="file" name="file" multiple/>
Run Code Online (Sandbox Code Playgroud)

JS

var auth = firebase.auth();
var storageRef = firebase.storage().ref();
//Handle waiting to upload each file using promise
function uploadImageAsPromise (imageFile) {
    return new Promise(function (resolve, reject) {
        var storageRef = firebase.storage().ref("/sth/"+imageFile.name);
        //Upload file
        var task = storageRef.put(imageFile);
        //Update progress bar
        task.on('state_changed',
            function progress(snapshot){
              // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
              var progress = (snapshot.bytesTransferred / snapshot.totalBytes) …
Run Code Online (Sandbox Code Playgroud)

html javascript jquery dropzone.js firebase-storage

5
推荐指数
1
解决办法
1388
查看次数

如何在 Flutter 中嵌套 StreamBuilder?

我有 2 个流,需要组合起来构建一个小部件,但与我见过的其他问题不同,我需要嵌套流。

我有一个从 Firestore 获取文档集合的流,以及一个依赖于第一个文档的数据来获取文档子集合的流。我想将它们组合成一个流,但它们需要嵌套,因为每个文档都有自己的文档子集合。

流 1(从 FireStore 获取习惯集合):

Stream<List> getHabits(){
  final Stream<QuerySnapshot> documents = Firestore.instance
    .collection("users")
    .document('VtL1sxOoCOdJaOTT87IbMRwBe282')
    .collection("habits")
    .snapshots();

  Stream<List> data = documents.map((doc) {
    List data;
    final documents = doc.documents;
    ///Maybe this would work to get history of each doc? 
    for(int i = 0; i < documents.length; i++){
      ///not sure what to do
      getHistory(documents[i].documentID, DateTime.utc(2019,7,7), DateTime.now());
    }

    data = documents.map((documentSnapshot) => documentSnapshot).toList();

    return data;
  });

  return data;
}
Run Code Online (Sandbox Code Playgroud)

Stream 2(在Stream 1中调用,作为DocumentID参数,获取文档的子集合):

Stream<List> getHistory(String id, DateTime start, …
Run Code Online (Sandbox Code Playgroud)

stream dart flutter google-cloud-firestore

3
推荐指数
1
解决办法
3205
查看次数

如何使用 Flutter 流式传输数据并添加到构建函数之外的列表

我有一个名为 Map() 的函数myData,它包含多个列表。我想使用 Stream 来填充Map. 对于这个 StreamBuilder 将无法工作,因为它需要返回并且我想使用List.add()功能。

Map<String, List<Widget>> myData = {
  'list1': [],
  'list2': [],
  'list3': [],
  'list4': []
};
Run Code Online (Sandbox Code Playgroud)

如何从 FireStore 获取信息但将其添加到列表而不是返回数据?

像这样,但这行不通。

StreamBuilder<QuerySnapshot>(
  stream: // my snapshot from firestore,
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    snapshot.data.documents.map((DocumentSnapshot doc) {
      myData['list1'].add(Text(doc['color']));
    });
  },
),
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

dart flutter google-cloud-firestore

2
推荐指数
1
解决办法
4310
查看次数