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

Flutter 如何在不同屏幕之间导航时使用StreamBuilder的通用实例,flutter,provider,bloc,stream-builder,Flutter,Provider,Bloc,Stream Builder,我试图实现一个简单的基本登录流,试图了解hoe流、BLoC和提供者的工作原理 这是我的模型- 对于firstName,我使用了streamController,而对于lastName,它只是一个简单的变量 class Authentication with ChangeNotifier { StreamController _firstNameStreamController = StreamController<String>.broadcast(); String la

我试图实现一个简单的基本登录流,试图了解hoe流、BLoC和提供者的工作原理

这是我的模型-

对于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();
  }
}

使用ChangeNotifier进行类身份验证{ StreamController _firstNameStreamController=StreamController.broadcast(); 字符串lastName=“lastName”; Sink get _firstNameSink=>_firstNameStreamController.Sink; Stream get firstNameStream=>\u firstNameStreamController.Stream; void populateFirstName(字符串fName){ _firstNameSink.add(fName); notifyListeners(); } void populatelastName(字符串lName){ lastName=lName; notifyListeners(); } 无效处置(){ _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, value, Widget child) => TextField(
              onSubmitted: (lastNameValue) {
                value.populatelastName(lastNameValue);
              },
            ),
          ),
          //submit
          Consumer<Authentication>(
            builder: (BuildContext context, value, 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");
                }
              )
            ),
          )
        ],
      ),
    );
  }
}

类登录页面扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
//名字
消费者(
生成器:(BuildContext上下文、值、小部件子项)=>TextField(
提交:(firstNameValue){
值。populateFirstName(firstNameValue);
},
),
),
//姓氏
消费者(
生成器:(BuildContext上下文、值、小部件子项)=>TextField(
onSubmitted:(lastNameValue){
值。populatelastName(lastNameValue);
},
),
),
//提交
消费者(
生成器:(BuildContext上下文、值、小部件子项)=>RaisedButton(
已按下:(){
push(context,materialpage(builder:(BuildContext context)=>ProfilePage());
},
孩子:StreamBuilder(
流:value.firstNameStream,
生成器:(上下文,快照){
返回文本(snapshot.data??“提交”);
}
)
),
)
],
),
);
}
}
在这里,当我在FirstTextField中提交firstName时,StreamBuilder正在正确更新,这很好

现在进入个人资料页面-

我试图同时显示firstName(使用streamBuilder)和lastName(简单变量),但是firstName没有正确显示(我在上一页的textfield中输入的),但是lastName没有问题

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


class ProfilePage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
消费者(
生成器:(BuildContext上下文、值、小部件子项)=>StreamBuilder(
流:value.firstNameStream,
生成器:(上下文,快照){
返回文本(snapshot.data);
}
),
),
消费者(
生成器:(BuildContext上下文、值、小部件子项)=>Text(value.lastName),
),
],
),
);
}
}
那么,为什么当接收器和流都在同一个页面(小部件)(在本例中为LoginPage)上完成时,StreamBuilder工作,而当接收器在一个页面(LoginPage)上完成,流在另一个页面(ProfilePage)上完成时,StreamBuilder不工作呢

我认为这不是提供者的问题,因为lastName(简单变量)显示得很好