flutter - 在 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
不会被调用。所以不会出现循环。
我在这里做错了吗?
解决方案
这是从 .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
推荐阅读
- sql-server - 如果单元格不为空,则计算出现次数
- apache - debian 上的 golang/apache/cgi --- apache 重定向停止工作
- javascript - 无法在 Netlify Lambda 函数中返回 mysql db 查询结果
- r - 如何在 R 中为每列添加具有不同条件的多列?
- mysql - 使用mysql存储过程将日期记录从行转换为列
- ruby - 在简单的 if 语句中使用正则表达式?
- c# - NotificationHub:如果使用相同的 PNS 句柄创建重复安装会怎样?
- ios - Http 调用不适用于 ionic 3 IOS 应用程序。在Android中工作正常
- reactjs - 使用道具的材质 UI 修改器类样式不起作用
- python-3.x - 在主列表中获取最小的数值,然后它出现的频率