如何向streamBuilder添加控制器?

Jac*_*ack 2 zip stream dart flutter google-cloud-firestore

颤动 飞镖

我是 flutter 的初学者,我正在尝试将控制器添加到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(),
            );
}
Run Code Online (Sandbox Code Playgroud)

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

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

Phu*_*huc 5

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');
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)