在myCtrl.stream.listen中调用myCtrl.sink.addError时出错

时间:2019-05-24 10:12:02

标签: flutter

我是Bloc模式和Stream的新手。创建区块时,我收到以下日志:

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。因此不会发生循环。

我在这里做错什么了吗?

1 个答案:

答案 0 :(得分:1)

这是从.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