首页 > 解决方案 > 将值从有状态类的状态传递到不同的小部件?

问题描述

我有一个功能:

class LoginPage extends StatefulWidget {
  static const routeName = '/auth';

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {

类 _LoginPageState 扩展状态中,我有一个布尔变量“已注册”,当用户第一次注册时,该变量在 setState 内更改为 true。每当它发生变化时,如何将这个值传递给我的主函数?此外,这个变量也需要从不同的地方更改为 true。基于它,我想向我的用户显示不同的屏幕 - 如下所示:

home: Scaffold(
    resizeToAvoidBottomInset: false,
    body: Container(
      child: registered ? OnboardingPage() : HomePage(),
    ),
  ),

你能给我看一些代码或指导我吗?谢谢你的帮助!

标签: androidflutterdartmobile

解决方案


You can use a combination of StreamBuilder and Provider to first get the data asynchronously, and then send that data to different places in your widget tree. Something like:

final StreamController _controller = StreamController();

// Provide this _controller in your top level widget tree
return Provider<StreamController>(
    create: (context) => _controller,
    child: MaterialApp(...),
);

In your _LoginPageState, whenever you get a new registered value:

// ... other lines
var registered = async getUserRegisterStatus() // sample method

// Add the new value to Stream
Provider.of<StreamController>.add(registered);

You can then use this controller to notify any below widget of the change of value:

// 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(),
         );
       }
    ),
  ),

推荐阅读