在不同屏幕之间导航时如何使用StreamBuilder的公共实例

问题描述

我正在尝试实现基本且简单的登录流程,试图了解hoe Stream,BloC和Providers的工作。

这是我的模特-

对于firstName,我使用了streamController,对于lastName,它只是一个简单的变量。

class Authentication with ChangeNotifier {
  StreamController _firstNameStreamController = StreamController<String>.broadcast();

  String lastName = "lastName";
  Sink get _firstNameSink => _firstNameStreamController.sink;

  Stream<String> get firstNameStream => _firstNameStreamController.stream;

  void populateFirstName(String fName) {
    _firstNameSink.add(fName);
    notifyListeners();
  }

  void populatelastName(String lName) {
    lastName = lName;
    notifyListeners();
  }

  void dispose() {
    _firstNameStreamController.close();
  }
}

这是登录页面-

有两个文本字段,分别是firstName和lastName,以及一个提交按钮,该按钮导航到ProfilePage。

class LoginPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          //firstname
          Consumer<Authentication>(
            builder: (BuildContext context,value,Widget child) => TextField(
              onSubmitted: (firstNameValue) {
                value.populateFirstName(firstNameValue);
              },),//lastname
          Consumer<Authentication>(
            builder: (BuildContext context,Widget child) => TextField(
              onSubmitted: (lastNameValue) {
                value.populatelastName(lastNameValue);
              },//submit
          Consumer<Authentication>(
            builder: (BuildContext context,Widget child) => RaisedButton(
              onpressed: () {
                Navigator.push(context,MaterialPageRoute(builder: (BuildContext context) => ProfilePage()));
              },child: StreamBuilder<String>(
                stream: value.firstNameStream,builder: (context,snapshot) {
                  return Text(snapshot.data ?? "Submit");
                }
              )
            ),)
        ],);
  }
}

在这里,当我在第一个文本字段中提交firstName时,StreamBuilder正在正确更新,这很好。

现在进入个人资料页面-

我试图同时显示firstName(使用streamBuilder)和lastName(简单变量),但是firstName显示不正确(我在上一页文本字段中输入的名字),但是lastName很好。

class ProfilePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Consumer<Authentication>(
            builder: (BuildContext context,Widget child) => StreamBuilder<String>(
              stream: value.firstNameStream,snapshot) {
                return Text(snapshot.data);
              }
            ),Consumer<Authentication>(
            builder: (BuildContext context,Widget child) => Text(value.lastName),],);
  }
}


那么,当接收器和流都在同一页面(小部件)(在本例中为LoginPage)中完成时,为什么StreamBuilder起作用,但是当在一个页面(LoginPage)上完成接收器而在另一页面(ProfilePage)中完成流时却不能运行。

我认为它不是提供程序问题,因为lastName(简单变量)显示良好。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...