Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Rxdart BehaviorSubject使其值为null_Dart_Flutter - Fatal编程技术网

Rxdart BehaviorSubject使其值为null

Rxdart BehaviorSubject使其值为null,dart,flutter,Dart,Flutter,我在Rxdart行为主体方面有一个有线问题!我在flatter中创建了一个屏幕,其中有两个TextField和一个DropdownButton,我用bloc模式接收它们的数据 但是,当我更改TextFields值时,连接到DropdownButton的BehaviorSubject的值变为null,当我更改DropdownButton值时,连接到TextFields的两个BehaviorSubjects的值变为null 此外,它不会影响小部件呈现 谁能帮我理解我做错了什么。这是我的集团代码: c

我在Rxdart
行为主体
方面有一个有线问题!我在flatter中创建了一个屏幕,其中有两个
TextField
和一个
DropdownButton
,我用bloc模式接收它们的数据

但是,当我更改
TextField
s值时,连接到
DropdownButton
BehaviorSubject
的值变为null,当我更改
DropdownButton
值时,连接到
TextField
s的两个
BehaviorSubject
s的值变为null

此外,它不会影响小部件呈现

谁能帮我理解我做错了什么。这是我的集团代码:

class Bloc {
  final _type = BehaviorSubject<String>();
  final _amount = BehaviorSubject<String>();
  final _title = BehaviorSubject<String>();

  Stream<String> get type => _type.stream;
  Stream<String> get amount => _amount.stream;
  Stream<String> get title => _title.stream;

  Function(String) get changeType => _type.sink.add;
  Function(String) get changeAmount => _amount.sink.add;
  Function(String) get changeTitle => _title.sink.add;

  createTransaction() {
    final validType = _type.value;
    final validAmount = _amount.value;
    final validTitle = _title.value;

    print(validType);
    print(validAmount);
    print(validTitle);
  }

  dispose() {
    _type.close();
    _amount.close();
    _title.close();
  }

}
class集团{
final _type=BehaviorSubject();
最终金额=行为主体();
最终标题=行为主体();
Stream get type=>\u type.Stream;
Stream get amount=>\u amount.Stream;
流获取标题=>\u title.Stream;
函数(字符串)get changeType=>\u type.sink.add;
函数(字符串)get changeAmount=>\u amount.sink.add;
函数(字符串)get changetTitle=>\u title.sink.add;
createTransaction(){
最终有效类型=_type.value;
最终有效金额=_amount.value;
最终有效标题=_title.value;
打印(有效类型);
打印(validAmount);
打印(有效标题);
}
处置{
_输入.close();
_金额关闭();
_title.close();
}
}

所以在重写代码之后,我终于找到了问题所在。这太烦人了,我希望这个答案能帮助其他人

问题是我在路由中添加了提供者,因此代码如下:

Route routes(RouteSettings settings) {
  switch(settings.name) {
    case '/app':
      return MaterialPageRoute(
        builder: (context) {
          return MainProvider(child: MainScreen());
        }
      );
    ...
  }
}
因此,我将其更改为此代码,并将所有提供程序带到主构建函数中:

class App extends StatelessWidget {
  Widget build(context) {
    return UserProvider(
      child: ListsProvider(
        child: TransactionsFormProvider(
          child: MaterialApp(
            onGenerateRoute: routes,
            ...
          ),
        ),
      ),
    );
  }
}

但是最后我不明白
行为主体
和这个解决方案之间的关系:)

有人能帮我找到一个更好的标题吗?你找到问题的原因了吗。我也遇到了同样的问题。如果您发现了,请帮助我好吗?我的代码的问题是我将bloc providers作为
MaterialPage路由
的子级,但不知何故这是错误的,您应该将providers作为
MaterialPage路由
的父级。我希望你能理解