繁体   English   中英

将有状态 class 的 state 的值传递给不同的小部件?

[英]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()),
  );

您可以使用StreamBuilderProvider的组合首先异步获取数据,然后将该数据发送到小部件树中的不同位置。 就像是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM