【问题标题】:How to add controller to streamBuilder?如何将控制器添加到streamBuilder?
【发布时间】:2021-09-30 08:52:48
【问题描述】:

颤动 飞镖

我是颤振的初学者,我正在尝试将控制器添加到 streamBuilderWidget 以便我可以处理它,但我不知道应该将控制器放在哪里.. 我试过这个

下面的流作为小部件不起作用

StreamController<QuerySnapshot> controller;
        void dispose() {
            super.dispose();
            controller.close();
          }
        
          void initState() {
            super.initState();
            controller = StreamController<QuerySnapshot>();
          }
        
         StreamBuilder<QuerySnapshot>(
    stream: FirebaseFirestore.instance.collection("users").doc(widget.documentUid).snapshots(),
     builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
         if (!snapshot.hasData) {
              return Center(
              child: circulearProgress(),
            );
}

在这段代码中,它从未处理或关闭流:(

任何以正确方式编辑我的代码的人都会非常感谢他,谢谢朋友

【问题讨论】:

    标签: flutter dart google-cloud-firestore stream zip


    【解决方案1】:

    从您的 cmets 看来,您似乎想通过以下方法关闭侦听器:

    void handleDelete() {
    FirebaseFirestore.instance.collection("handleCountM").doc(currentUser.uid + widget.documentUid).collection("handleCountM2").limit(1).snapshots()
      .listen((value) { 
         value.docs.forEach((element) { 
           element.reference.delete(); 
         }); 
      }); 
    }
    

    您可以通过获取对流订阅的引用并在订阅上调用 .cancel 来做到这一点。

    在流上调用 .listen 会返回一个流订阅对象,如下所示:

    StreamSubscription handleDeleteStreamSubscription =  FirebaseFirestore.instance.collection("handleCountM").doc(currentUser.uid + widget.documentUid).collection("handleCountM2").limit(1).snapshots()
      .listen((value) { 
         value.docs.forEach((element) { 
           element.reference.delete(); 
         }); 
      });
    

    取消订阅是这样完成的:

    handleDeleteStreamSubscription.cancel();
    

    【讨论】:

      【解决方案2】:

      StreamController 就像一个管道。在您的情况下,该管道从供水商到您的房屋,无需担心那里会发生什么。 但是,如果您想设置从洗衣机到排水孔的管道,则需要使用 StreamController。 示例:

      class HomeScreen extends StatefulWidget {
      
        @override
        _HomeScreenState createState() => _HomeScreenState();
      }
      
      class _HomeScreenState extends State<HomeScreen> {
        final NumberController controller = NumberController();
      
        @override
        void dispose() {
          controller.dispose();
        }
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            body: SafeArea(
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    InputWidget(controller: controller,),
                    OutputWidget(controller: controller,)
                  ],
                ),
              ),
            ),
          );
        }
      }
      
      class NumberController {
        //This is the pipeline of "number"
        final StreamController<int> controller = StreamController<int>.broadcast();
      
        //This is where your "number" go in
        Sink<int> get inputNumber => controller.sink;
      
        //This is where your "number" go out
        Stream<int> get outputNumber => controller.stream;
      
        //Dispose
        void dispose() {
          controller.close();
        }
      }
      
      class InputWidget extends StatelessWidget {
        final NumberController controller;
      
        const InputWidget({Key key, this.controller}) : super(key: key);
        @override
        Widget build(BuildContext context) {
          return InkWell(
              onTap: () {
                  controller.inputNumber.add(Random().nextInt(10));
              },
          child: Text(
            'Random Number'
          ),);
        }
      }
      
      class OutputWidget extends StatelessWidget {
        final NumberController controller;
      
        const OutputWidget({Key key, this.controller}) : super(key: key);
        @override
        Widget build(BuildContext context) {
          return StreamBuilder<int>(
            stream: controller.outputNumber,
            builder: (context, snapshot) {
              return Text(snapshot.hasData ? snapshot.data.toString() : 'No data');
            },
          );
        }
      }
      

      【讨论】:

      • 非常感谢这个很棒的例子,我有这个 handleDelete(){ FirebaseFirestore.instance.collection("handleCountM").doc(currentUser.uid + widget.documentUid).collection("handleCountM2") .limit(1).snapshots().listen((value) { value.docs.forEach((element) { element.reference.delete(); }); });当我按下后退按钮时,我怎么能关闭它
      【解决方案3】:

      您不必使用 StreamController。您正在使用的 StreamBuilder 在内部关闭流。

      【讨论】:

      • 感谢您提供此信息,但当我按下后底部 FirebaseFirestore.instance.collection("handleCountM").doc(currentUser.uid + widget.documentUid).collection 时,我试图关闭此功能("handleCountM2").limit(1).snapshots().listen((value) { value.docs.forEach((element) { element.reference.delete(); }); });当我按下后退按钮时,我怎么能关闭它
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多