flutter - 流控制器未注册接收器事件颤动
问题描述
我正在使用 bloc 模式来处理我的应用程序中的状态。但是,将数据下沉到我的流中不起作用。如果文本字段为空,我有一个formfield
返回 null 的按钮。这是我的集团
class SavingsCategoryBloc {
final amount = PublishSubject<int>();
Stream<int> get amountStream => amount.stream;
Function(int) get amountSink => amount.sink.add;
}
这是我的屏幕
class _StartSavingPageState extends State<StartSavingPage> {
final SavingsCategoryBloc bloc = SavingsCategoryBloc();
...
@override
Widget build(BuildContext context) {
...
Container(
padding: EdgeInsets.symmetric(
horizontal: 15.0, vertical: 15.0),
child: TextField(
onChanged: (String value) => bloc.amountSink,
keyboardType: TextInputType.number,
controller: amountController,
decoration: InputDecoration(
labelText: 'AMOUNT TO SAVE ',
labelStyle: TextStyle(
fontFamily: 'Montserrat',
fontSize: 2.1 * SizeConfig.textMultiplier,
color: Colors.grey),
focusedBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.purple))),
),
),
....
Container(
padding: EdgeInsets.symmetric(
horizontal: 15.0, vertical: 15.0),
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(25.0))),
width: double.infinity,
child: StreamBuilder(
stream: bloc.amountStream,
builder: (context, snapshot) {
return RaisedButton(
elevation: 5.0,
onPressed: snapshot.hasData
? () => print('hi')
: null,
padding: EdgeInsets.all(15.0),
color: Colors.purple,
child: Text(
'SAVE',
style: TextStyle(
color: Colors.white,
letterSpacing: 1.5,
fontSize: 18.0,
fontWeight: FontWeight.bold,
fontFamily: 'OpenSans',
),
),
);
}),
)
即使formfield
不为空,该按钮仍保持禁用状态。
解决方案
您没有在流中添加数据,也没有使用streamcontroller。
以下示例清除您的想法。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/subjects.dart';
class SavingsCategoryBloc {
final _counterController = PublishSubject<int>();
Stream<int> get amountStream => _counterController.stream;
Sink<int> get amountSink => _counterController.sink;
dispose() {
_counterController.close();
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(body: HomeWidget()),
);
}
}
class HomeWidget extends StatefulWidget {
const HomeWidget({Key key}) : super(key: key);
@override
_HomeWidgetState createState() => _HomeWidgetState();
}
class _HomeWidgetState extends State<HomeWidget> {
SavingsCategoryBloc bloc = SavingsCategoryBloc();
@override
void dispose() {
bloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextField(
onChanged: (String value) => bloc.amountSink.add(int.parse(value)),
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'AMOUNT TO SAVE ',
labelStyle:
TextStyle(fontFamily: 'Montserrat', color: Colors.grey),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.purple))),
),
SizedBox(
height: 20,
),
Container(
padding: EdgeInsets.symmetric(horizontal: 15.0, vertical: 15.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(25.0))),
width: double.infinity,
child: StreamBuilder(
stream: bloc.amountStream,
// initialData: "",
builder: (context, snapshot) {
return RaisedButton(
elevation: 5.0,
onPressed: snapshot.hasData ? () => print('hi') : null,
padding: EdgeInsets.all(15.0),
color: Colors.purple,
child: Text(
'SAVE',
style: TextStyle(
color: Colors.white,
letterSpacing: 1.5,
fontSize: 18.0,
fontWeight: FontWeight.bold,
fontFamily: 'OpenSans',
),
),
);
}),
)
],
),
);
}
}
推荐阅读
- java - 异常:com.microsoft.sqlserver.jdbc.SQLServerException:列名 ID 无效
- javascript - 从孩子更改父母的一部分 - React.js
- firebase - Firestore 安全规则获取功能
- javascript - 生成ajax调用的循环数组,我需要在下一个调用开始之前完成第一个调用
- python - 尝试在多选场景中根据用户回答(在特定点)结束脚本
- loops - Unity 3d随着时间的推移使用浮点数进行循环
- google-apps-script - 从文档中的其他位置执行公式后替换单元格值
- spring-mvc - 如何为 spring-mvc restful url 模式设置默认值?
- microservices - 微服务环境中的认证和授权
- ios - 如何为快速播放的声音添加延迟