Flutter 使用stream/blocs在列表的textfield中设置值
使用流/块时,我在设置文本字段的值时遇到问题。基本上,我有一个文本字段,当单击时,我希望弹出一个对话框,列出要选择的值列表。当用户选择一个值时,该值应在文本字段中设置。当使用常规textfield时,我知道我可以使用textfield.text=value,但当使用stream/blocs时则不同。我不知道如何使用它 这是我的流代码Flutter 使用stream/blocs在列表的textfield中设置值,flutter,Flutter,使用流/块时,我在设置文本字段的值时遇到问题。基本上,我有一个文本字段,当单击时,我希望弹出一个对话框,列出要选择的值列表。当用户选择一个值时,该值应在文本字段中设置。当使用常规textfield时,我知道我可以使用textfield.text=value,但当使用stream/blocs时则不同。我不知道如何使用它 这是我的流代码 import 'dart:async'; import 'validators.dart'; import 'package:rxdart/rxdart.dart'
import 'dart:async';
import 'validators.dart';
import 'package:rxdart/rxdart.dart';
class Bloc extends Object with Validators {
final amountController = BehaviorSubject<String>();
final frequencyController = BehaviorSubject<String>();
final datePaidController = BehaviorSubject<String>();
final categoryController = BehaviorSubject<String>();
final depositToController = BehaviorSubject<String>();
final descriptionController = BehaviorSubject<String>();
// Add data to stream
Stream<String> get amount => amountController.stream.transform(validateAmount);
Stream<String> get frequency =>
frequencyController.stream.transform(validateEmpty);
Stream<String> get datePaid =>
datePaidController.stream.transform(validateEmpty);
Stream<String> get category =>
categoryController.stream.transform(validateEmpty);
Stream<String> get deposit =>
depositToController.stream.transform(validateEmpty);
Stream<String> get description =>
descriptionController.stream.transform(validateEmpty);
/*
Stream<bool> get submitValid =>
Observable.combineLatest6(amount, frequency, datePaid, category, deposit,
description, (a,b,c,d,e,f) => true);
*/
// change data
Function(String) get changeAmount => amountController.sink.add;
Function(String) get changeFrequency => frequencyController.sink.add;
Function(String) get changeDatePaid => datePaidController.sink.add;
Function(String) get changeCategory => categoryController.sink.add;
Function(String) get changeDepositTo => depositToController.sink.add;
Function(String) get changeDescription => descriptionController.sink.add;
submit() {
final validAmount = amountController.value;
final validFrequency = frequencyController.value;
final validDatePaid = datePaidController.value;
final validCategory = categoryController.value;
final validDepositTo = depositToController.value;
final validDescription = descriptionController.value;
// print('Email is $validEmail, and password is $validPassword');
}
dispose() {
amountController.close();
frequencyController.close();
datePaidController.close();
categoryController.close();
depositToController.close();
descriptionController.close();
}
}
导入'dart:async';
导入“validators.dart”;
导入“包:rxdart/rxdart.dart”;
类Bloc使用验证器扩展对象{
最终金额控制器=行为主体();
最终频率控制器=行为主体();
final datePaidController=BehaviorSubject();
最终类别控制器=行为主体();
最终存款控制器=行为主体();
最终描述控制器=行为主体();
//向流中添加数据
Stream get amount=>amountController.Stream.transform(validateAmount);
流获取频率=>
frequencyController.stream.transform(validateEmpty);
流获取日期支付=>
datePaidController.stream.transform(validateEmpty);
流获取类别=>
categoryController.stream.transform(validateEmpty);
流获取存款=>
depositocontroller.stream.transform(validateEmpty);
流获取描述=>
descriptionController.stream.transform(validateEmpty);
/*
流获取submitValid=>
可观察。组合相关6(金额、频率、支付日期、类别、存款、,
描述(a、b、c、d、e、f)=>真;
*/
//更改数据
函数(字符串)get-changeAmount=>amountController.sink.add;
函数(字符串)get-changeFrequency=>frequencyController.sink.add;
函数(字符串)get changedatepayd=>datePaidController.sink.add;
函数(字符串)get changeCategory=>categoryController.sink.add;
函数(字符串)get-ChangeDeposito=>DepositoController.sink.add;
函数(字符串)get changeDescription=>descriptionController.sink.add;
提交(){
最终validAmount=amountController.value;
最终有效频率=frequencyController.value;
最终validDatePaid=datePaidController.value;
最终有效类别=类别控制器.value;
最终有效存款=存款至控制器的价值;
最终有效描述=descriptionController.value;
//打印(“电子邮件为$validMail,密码为$validPassword”);
}
处置{
amountController.close();
frequencyController.close();
datePaidController.close();
categoryController.close();
存款到控制器。关闭();
descriptionController.close();
}
}
我的文本字段代码(与上面的不同类别)
final bloc=Provider.of(上下文);
返回流生成器(
流:bloc.amount,
生成器:(上下文,快照){
返回文本字段(
一旦更改:bloc.changeAmount,
键盘类型:TextInputType.text,
装饰:输入装饰(
hintText:“收入金额”,
//labelText:“电子邮件地址”,
errorText:snapshot.error,
前缀:图标(图标。附加钱),
后缀:IconButton(
图标:图标(图标。向右箭头),
按下:()=>{
显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
//返回对话框类型的对象
返回警报对话框(
标题:新文本(“警报对话框标题”),
内容:新文本(“警报对话框正文”),
行动:[
//通常是可供选择的项目列表
),
],
);
},
)
},
),
),
);
},
);
如果您查看textfield代码,则textfield上的图标具有onPressed功能。按下时,将出现一个对话框供用户选择值。一旦选择了一个值,我想用该值设置textfield。我正在使用streams/blocs,我不知道怎么做,因为文本控制器在Bloc类中,而textfield代码是另一个类。当用户从弹出列表中选择时,有人可以帮助设置textfield值吗?提前感谢使用
它将允许您在文本字段中处理和设置文本值
您可以这样使用它:
final_controller=TextEditingController();
在文本字段中,分配\u控制器
:
TextField(
控制器:_控制器,
//其他一切都应该和以前一样
),
当需要使用新值更新文本字段时,可以执行以下操作:
\u controller.text=newAmountFromStream;
如果你需要更多的帮助,请告诉我
final bloc = Provider.of(context);
return StreamBuilder(
stream: bloc.amount,
builder: (context, snapshot) {
return TextField(
onChanged: bloc.changeAmount,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: 'Income Amount',
// labelText: 'Email Address',
errorText: snapshot.error,
prefixIcon: Icon(Icons.attach_money),
suffix: IconButton(
icon: Icon(Icons.arrow_right),
onPressed: () => {
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
title: new Text("Alert Dialog title"),
content: new Text("Alert Dialog body"),
actions: <Widget>[
// usually list of items to choose from
),
],
);
},
)
},
),
),
);
},
);