首页 > 解决方案 > 在 myCtrl.stream.listen 中调用 myCtrl.sink.addError 时出错

问题描述

我是 Bloc 模式和 Stream 的新手。在创建 bloc 时,我得到了以下日志:

E/flutter (18086): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: ss
E/flutter (18086): null

你可以重现这个

import 'dart:async';

import 'package:flutter/material.dart';

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

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

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  StreamController<String> ctrl;

  @override
  void initState() {
    ctrl = StreamController<String>.broadcast();
    ctrl.stream.listen((value){
      ctrl.addError(value);
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          StreamBuilder(
            stream: ctrl.stream,
            builder: (context, snapshot) {
              return TextField(
                onChanged: ctrl.sink.add,
                decoration: InputDecoration(
                  errorText: snapshot.error,
                ),
              );
            },
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    ctrl.close();
    super.dispose();
  }
}

所以基本上我正在验证 TextField 输入。我通过发送数据并通过sink.add验证stream.listen发送错误sink.addError

我验证了在调用sink.addError时, stream.listen不会被调用。所以不会出现循环。

我在这里做错了吗?

标签: flutter

解决方案


这是从 .listen() 方法创建的 StreamSubscription 的默认行为。StreamSubscription 不知道如何处理错误,所以它只是向您显示。

为防止显示错误,请为其提供 onError 函数,以便它知道该怎么做。在调用 listen 方法或将其分配给它返回的 StreamSubscription 时执行此操作。

ctrl.stream.listen((value){
  ctrl.addError(value);
}, onError: (_) {
  //insert code here
});

文档:https ://api.dartlang.org/stable/2.3.1/dart-async/Stream/listen.html


推荐阅读