我是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
。因此不会发生循环。
我在这里做错什么了吗?
答案 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