Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 使用stream/blocs在列表的textfield中设置值_Flutter - Fatal编程技术网

Flutter 使用stream/blocs在列表的textfield中设置值

Flutter 使用stream/blocs在列表的textfield中设置值,flutter,Flutter,使用流/块时,我在设置文本字段的值时遇到问题。基本上,我有一个文本字段,当单击时,我希望弹出一个对话框,列出要选择的值列表。当用户选择一个值时,该值应在文本字段中设置。当使用常规textfield时,我知道我可以使用textfield.text=value,但当使用stream/blocs时则不同。我不知道如何使用它 这是我的流代码 import 'dart:async'; import 'validators.dart'; import 'package:rxdart/rxdart.dart'

使用流/块时,我在设置文本字段的值时遇到问题。基本上,我有一个文本字段,当单击时,我希望弹出一个对话框,列出要选择的值列表。当用户选择一个值时,该值应在文本字段中设置。当使用常规textfield时,我知道我可以使用textfield.text=value,但当使用stream/blocs时则不同。我不知道如何使用它

这是我的流代码

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

              ),
              ],
              );
              },
              )
              },

            ),
          ),
        );
      },
    );