flutter - 如何处理 Stream Controller Flutter

标签 flutter dart

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

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

下面是基本 Bloc 的片段和无状态小部件的流构建器

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),
            )
          ],
        ));
  }
}

最佳答案

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

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

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

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

关于flutter - 如何处理 Stream Controller Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56921398/

相关文章:

flutter - 有没有办法有条件地重建小部件

Flutter BLoC 多个 BLoC 相同的小部件

flutter - 如何在 Flutter 中更改 CupertinoSlidingSegmentedControl 的宽度

firebase - Flutter Firebase如何使用Google登录用户

Flutter - 可聚焦的 ListView 项目

dart JSON 字符串转换为列表字符串

Flutter 2 - 设置自动完成 TextFormField 的初始值

flutter 错误: A value of type 'OutletListModel' can't be assigned to a variable of type 'List<OutletListModel>?'

dart - 讨论问题:为什么dart不允许在类中声明枚举?

dart - 如何使用 Dart 动态加载 HTML 并插入到我的网页中?