【问题标题】:How to dispose of a Stream controller Flutter如何处理流控制器 Flutter
【发布时间】:2019-11-17 04:05:38
【问题描述】:

我正在测试如何使用流和流控制器,使用基本的 Bloc 模式,但我仍然不明白如何正确处理它们是否使用它来更新 UI 或触发其他集团。

我注意到其他人的代码在无状态或有状态小部件上处理它,但我想知道它是否也可以在 Bloc 类上完成

下面是基本 Bloc 的 sn-p 和无状态小部件的流构建器

CounterBloc.dart

import 'dart:async';

class CounterBloc {
  int _counter = 10;
  StreamController<int> _countController = StreamController<int>();

  Stream<int> get counterStream => _countController.stream;
  StreamSink<int> get counterSink => _countController.sink;

  void incrementCounter() {
    _counter++;
    counterSink.add(_counter);
  }
}

ma​​in.dart

import 'package:flutter/material.dart';
import 'package:test_bloc/counter_bloc.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final counterClass = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Home Page"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              StreamBuilder(
                stream: counterClass.counterStream,
                builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
                  if (snapshot.hasData) {
                    print(snapshot.data.toString() + ' this is test');
                    return Text(snapshot.data.toString());
                  } else {
                    return CircularProgressIndicator();
                  }
                },
              )
            ],
          ),
        ),
        floatingActionButton: Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            FloatingActionButton(
              onPressed: () {
                counterClass.incrementCounter();
              },
              tooltip: 'Increment',
              child: Icon(Icons.add),
            )
          ],
        ));
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可能希望在 Bloc 类中创建一个方法,例如 closeStream

    Future<void> closeStream() => _streamController?.close();
    

    将您的HomePage 转换为StatefulWidget,覆盖dispose() 方法,然后使用

    @override
    void dispose() {
      counterClass?.closeStream();
      super.dispose();
    }
    

    【讨论】:

    • 如果我不想处理流并且还想将计数器重置为其初始值,以便我可以从 0 值再次监听事件。
    • @ajs.sonawane 在评论中回答你的问题几乎是不可能的,我认为你应该为此提出一个单独的问题。
    • 是的,我在这里试过stackoverflow.com/questions/61694115/…
    • dispose 不是 StatefulWidget 类中的方法
    • @altair disposeState 类中的一个方法
    猜你喜欢
    • 2020-05-12
    • 2021-05-25
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多