如何处理流控制器 Flutter

Jam*_*med 5 dart flutter

我正在测试如何使用流和流控制器,使用基本的 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 increamentCounter() {
    _counter++;
    counterSink.add(_counter);
  }
}
Run Code Online (Sandbox Code Playgroud)

main.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.increamentCounter();
              },
              tooltip: 'Increment',
              child: Icon(Icons.add),
            )
          ],
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)

Cop*_*oad 10

您可能想closeStreamBloc类中创建一个方法 say 。

void closeStream() {
  _countController.close();
}
Run Code Online (Sandbox Code Playgroud)

将您的HomePageto StatefulWidget、overridedispose()方法转换并使用

@override
void dispose() {
  counterClass.closeStream();
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)