[英]Pass value from state of stateful class to different widget?
我有一个 function:
class LoginPage extends StatefulWidget {
static const routeName = '/auth';
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
在class _LoginPageState extends State内部,我有一个布尔变量“已注册”,当用户第一次注册时,该变量在 setState 内更改为 true。 每当它发生更改时,如何将此值传递给我的主 function? 此外,这个变量也需要从不同的地方更改为 true。 基于它,我想向我的用户显示不同的屏幕 - 如下所示:
home: Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
child: registered ? OnboardingPage() : HomePage(),
),
),
你能给我看一些代码或指导我吗? 谢谢你的帮助!
您的登录页面
class LoginPage extends StatefulWidget {
LoginPage({Key key}) : super(key: key);
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
bool registered;
// ...
void gotoSecondPage() {
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => SecondPage(registered),));
}
}
你的另一页
class SecondPage extends StatefulWidget {
bool registered;
SecondPage(this.registered);
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
child: widget.registered ? OnboardingPage() : HomePage(),
),
);
}
}
如果此变量在_LoginPageState
内更改,您可以根据其值重定向用户,如下所示:
// BEGIN: TODO
// registered = true;
// END: TODO
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => registered ? OnboardingPage() : HomePage()),
);
您可以使用StreamBuilder
和Provider
的组合首先异步获取数据,然后将该数据发送到小部件树中的不同位置。 就像是:
final StreamController _controller = StreamController();
// Provide this _controller in your top level widget tree
return Provider<StreamController>(
create: (context) => _controller,
child: MaterialApp(...),
);
在您的_LoginPageState
中,每当您获得新的registered
值时:
// ... other lines
var registered = async getUserRegisterStatus() // sample method
// Add the new value to Stream
Provider.of<StreamController>.add(registered);
然后,您可以使用此 controller 通知以下任何小部件值的更改:
// Sample place that needs the value
home: Scaffold(
resizeToAvoidBottomInset: false,
body: StreamBuilder<bool>(
initialValue: false
stream: Provider.of<StreamController>.stream,
builder: (context, snapshot) {
if (!snapshot.hasData) return Container(child: CircularProgressIndicator());
var registered = snapshot.data;
return Container(
child: registered ? OnboardingPage() : HomePage(),
);
}
),
),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.