如何解决在不同屏幕之间导航时如何使用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 举报,一经查实,本站将立刻删除。