标签: stream-builder

Flutter - 接收并修改来自 Stream 的数据

我正在尝试执行以下操作:

  1. 侦听 Firestore 流,以便在添加新文档时,StreamBuilder 将接收它、修改它,然后呈现它。

“修改”获取 Stream 数据(其中包括 Firestore UID),使用该 UID 从 Firestore 获取数据,然后使用该数据填充 StreamBuilder。

因此流程是:添加新文档 -> Stream 获取文档 -> 函数从该文档获取 UID -> 函数使用该 UID 从 Firestore 获取更多数据 -> 函数返回以使用新数据填充 StreamBuilder。

我当前的设置如下——它有效,但 FutureBuilder 显然在每次重建小部件时都会调用 Firestore,而没有人希望这样。


  Stream<QuerySnapshot> upperStream;

  void initState() {
    super.initState();
    upperStream = aStream();
}

  Stream<QuerySnapshot> aStream() {
    return Firestore.instance
        .collection('FirstLevel')
        .document(/*ownUID (not related to stream)*/)
        .collection('SecondLevel')
        .snapshots();
  }

  Future<List> processStream(List streamData) async {
    List futureData = List();

    for (var doc in streamData) {
      Map<String, dynamic> dataToReturn = Map<String, dynamic>(); …
Run Code Online (Sandbox Code Playgroud)

firebase flutter google-cloud-firestore stream-builder

4
推荐指数
1
解决办法
2889
查看次数

FLUTTER:如何在流构建器中使用导航器?

我正在尝试在流构建器中导航,但出现此错误:“在构建过程中调用了 setState() 或 markNeedsBuild()。”。如果我在 onpressed 按钮内调用导航它可以工作,但不仅仅是在条件内使用它。我被困住了。有一些代码可以向您展示。

Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream:
            Firestore.instance.collection('rooms').document(pinid).snapshots(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData) {
            if ((snapshot.data['Votes'][0] + snapshot.data['Votes'][1]) >=
                snapshot.data['joueurs']) {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => Results(),
                  ));
            }
          }
          return Center(
            child: Text('VOUS AVEZ VOTE'),
          );
        },
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

future firebase flutter google-cloud-firestore stream-builder

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

我需要取消 Stream&lt;QuerySnapshot&gt; (flutter)

我正在听 firestore 中的一系列文档(作为聊天应用程序的一部分)。我是通过使用服务来做到这一点的,该服务创建Stream<QuerySnapshot>如下:

_snapshots$ = Firestore.instance.collection('messages').orderBy('date',descending: false).snapshots()
Run Code Online (Sandbox Code Playgroud)

然后我创建一个 StreamBuilder 如下:

return StreamBuilder<List<Message>>(
        stream: widget.chatService.messages$,
        builder: (context, snapshot) => (snapshot.hasData)
...
Run Code Online (Sandbox Code Playgroud)

我想知道是否需要在包含StreamBuilder小部件的 dispose 方法中分离此流。我对 Streams 和 StreamBuilders 不太了解,所以我不确定如何做到这一点,但我真的想避免任何内存泄漏。

memory mobile flutter google-cloud-firestore stream-builder

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

从 mysql 获取数据到 StreamBuilder Flutter

我有一个作业,我必须将 mysql 服务器中的数据放入 flutter 中并将其传递给 StreamBuilder,我试图使用我们在 firebase 中使用它的同一类,现在我在传递我已经获取的数据时遇到问题从服务器到 StreamBuilder,我记得我必须使用不同类型的快照,任何帮助。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Server',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.pink,
      ),
      home: MyHomePage(title: 'Flutter Server App'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
} …
Run Code Online (Sandbox Code Playgroud)

php mysql snapshot flutter stream-builder

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

Flutter:StreamBuilder 快照——无数据

我刚刚学习 Flutter,并尝试使用 StreamBuilder 在用户注销时显示登录/注册页面,或者在用户登录时显示个人资料页面。我的代码如下:

认证服务:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

class AuthUser {
  AuthUser({@required this.uid, @required this.email});
  final String uid;
  final String email;
}

abstract class AuthBase {
  Future<AuthUser> currentUser();
  Future<AuthUser> signIn({String email, String pw});
  Future<AuthUser> registerUser({String email, String pw});
  Stream<AuthUser> get onAuthStateChanged;
  Future<void> signOut();
}

class Auth implements AuthBase {
  final _firebaseAuth = FirebaseAuth.instance;

  AuthUser _userFromFirebase(FirebaseUser user) {
    if (user != null) {
      return AuthUser(uid: user.uid, email: user.email);
    } else {
      return null;
    }
  }

  @override
  Stream<AuthUser> get onAuthStateChanged { …
Run Code Online (Sandbox Code Playgroud)

stream flutter stream-builder

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

StreamBuilder 更新性能(一个与多个)

更新具有多个子级的单个父级小部件与单独更新每个子级小部件之间的性能差异是什么?

哪个性能更高以及性能提高了多少:

StreamBuilder(
  stream:sameStream,
  builder(ctx,snapshot){
    return Column(
      children:[
       Text("1"),
       Text("2"),
       Text("3")
      ]
    ) 
  }
)
Run Code Online (Sandbox Code Playgroud)

或者

Column(
  children:[
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("1"):
      }
    ),
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("2"):
      }
    ),
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("3"):
      }
    )
  ]
)
Run Code Online (Sandbox Code Playgroud)

另一个问题:如果我们将子窗口部件缩放到 100 会发生什么?性能有变化吗?

performance dart flutter stream-builder

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

在 Flutter 中使用 streamBuilder 时条件不起作用

我正在尝试实现一个显示来自 Firebase 的数据的屏幕,但我想streambuilder检查数据库是否为空,如果为空,我希望它显示一个文本,上面写着“无数据”,但如果不是,我希望它显示来自 firebase 的数据。

这是我拥有的代码,但它没有按预期工作,它只是在没有数据时向我显示一个空白屏幕(当我在数据库中有数据时它工作正常,我只是不希望用户看到一个空白没有数据时的屏幕)。你能告诉我这段代码有什么问题吗?实现这一点的最佳方法是什么?

@override
  Widget build(BuildContext context) {
    double height = responsive.height(context);
    double width = responsive.width(context);
    var stream = Firestore.instance
        .collection('favoritePost')
        .document(widget.currentUserId)
        .collection('favoritePost')
        .orderBy('timestamp', descending: true)
        .snapshots();
    return Scaffold(
      backgroundColor: kBackgroundColorForAllScreens,
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(responsive.height(context) / 20),
        child: SimpleAppBar(
          label: 'Tus Favoritos',
          witdh: responsive.width(context) / 4.7,
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: Container(
              child: StreamBuilder(
                stream: stream,
                builder: (context, snapshotPost) {
                  if (snapshotPost.hasData) {
                    return ListView.builder(
                      itemExtent: height …
Run Code Online (Sandbox Code Playgroud)

dart firebase flutter stream-builder

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

如何在 Flutter 中手动分配 Listview.builder 的第一个元素?

我有一个 Flutter 应用程序,它在 Listview.builder 的卡片上显示事件(存储在 Cloud Firestore 中)。我有一个特定的事件,足球。它有自己的特殊卡片。列表中可以有多个常规赛事,但只有一个足球赛事。我想在列表的顶部显示此足球赛事,作为第一张卡片。我怎样才能做到这一点?

到目前为止我的代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fociapp/model/events.dart';
import 'package:fociapp/ui/event_card.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance.collection("events").snapshots(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          return snapshot.hasData
              ? Container(
                  color: Colors.grey[850],
                  child: ListView.builder(
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (BuildContext context, int index) {
                      DocumentSnapshot events = snapshot.data.documents[index];
                      Event event = Event(
                          events["eventName"],
                          events["startTime"],
                          events["coverImageUrl"],
                          events["location"],
                          events["description"]);

                      return EventCard(event);
                    },
                  ),
                )
              : Center(
                  child: CircularProgressIndicator(),
                );
        });
  }
}
Run Code Online (Sandbox Code Playgroud)
Event …

android-listview firebase flutter google-cloud-firestore stream-builder

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

Flutter如果数据发生变化如何更新Listview.builder

我正在 Flutter 中使用ListView.builder。现在一切正常,我在回调方法中有以下代码行:

@override
void initState(){
  items = new List();
  for(int index = 0; index < dataList.length; index++){
    items.add(...creating widget ..);
  }
}

 @override
  Widget build(BuildContext context) {
    return Container(
    child: ListView.builder(
        scrollDirection: Axis.vertical,
       shrinkWrap: true,
       itemCount: dataList.length,
       itemBuilder: (BuildContext context, int index) {
          return Container(
            width: width,
            height: 160 ,
            key: UniqueKey(),
            padding: EdgeInsets.all(10),
            child: items[index],
          );
        },
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

问题是当 dataList 的数据更新时,如果数据值更新、删除或位置更改,我应该如何实现此列表以使列表更新 UI StreamBuilder 是解决方案吗?

listview auto-update flutter stream-builder

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

你如何在 flutter.dart 中连续检查互联网访问,而不是连接

你如何持续检查互联网访问?我能够显示是否已连接 wifi 或移动数据。但是,并非所有连接都可以访问 Internet。

 import 'package:connectivity/connectivity.dart';

var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
  // I am connected to a mobile network.
} else if (connectivityResult == ConnectivityResult.wifi) {
  // I am connected to a wifi network.
}
Run Code Online (Sandbox Code Playgroud)

这是我目前使用的代码。我希望有人可以连续检查互联网访问?

connection firebase flutter stream-builder

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