如何从处于状态的对象中获取值(flutter_bloc)

Ali*_*zen 3 flutter bloc flutter-bloc

在构建器方法中,我达到了状态值,例如

\n
return BlocBuilder<UsersOwnProfileBloc, UsersOwnProfileState>(\n   cubit: widget.bloc,\n   builder: (context, state) {\n      if (state is FetchedUserSettingState) {\n      bool account = state.userSettings.publicAccount\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

但我需要从 initState 获取值。我需要设置小部件的值。我尝试了类似的方法,但出现错误

\n
 @override\n  void initState() {\n    super.initState();\n     UsersOwnProfileState state = BlocProvider.of<UsersOwnProfileBloc>(context).state;\n     if (state is FetchedUserSettingState) {\n       publicAccount = state.userSettings.publicAccount;\n     }\n} \n
Run Code Online (Sandbox Code Playgroud)\n

谁能告诉我如何获取 initState 中的状态值?

\n
class UserSettingPage extends StatefulWidget {\n  final UsersOwnProfileBloc bloc;\n\n  const UserSettingPage({Key key, this.bloc}) : super(key: key);\n\n  @override\n  _UserSettingPageState createState() => _UserSettingPageState();\n}\n\nclass _UserSettingPageState extends State<UserSettingPage> {\n  bool newListingAlert;\n  bool listingForSearchAlert;\n  bool searchForListingAlert;\n  bool followAlert;\n  bool publicAccount;\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      final state = BlocProvider.of<UsersOwnProfileBloc>(context).state;\n      if (state is FetchedUserSettingState) {\n        publicAccount = state.userSettings.publicAccount;\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return BlocBuilder<UsersOwnProfileBloc, UsersOwnProfileState>(\n      cubit: widget.bloc,\n      builder: (context, state) {\n        if (state is FetchedUserSettingState) {\n          return Scaffold(\n            appBar: PreferredSize(\n              preferredSize: Size.fromHeight(25.h),\n              child: ListingEditAppBar(\n                onCancel: () {\n                  widget.bloc.add(FetchUserEvent(userId: CurrentUser.currentUser.id));\n                  Navigator.pop(context);\n                },\n              ),\n            ),\n            body: Column(\n              children: [\n                PageTitle(title: "Preferences"),\n                Expanded(\n                  child: ListView(\n                    children: [\n                      Padding(\n                        padding: const EdgeInsets.all(8.0),\n                        child: Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          crossAxisAlignment: CrossAxisAlignment.center,\n                          children: [\n                            Text("Profilim herkese a\xc3\xa7\xc4\xb1k"),\n                            Switch(\n                              onChanged: (value) {\n                                setState(() {\n                                  publicAccount = value;\n                                });\n                              },\n                              value: publicAccount,\n                            )\n                          ],\n                        ),\n                      )\n                    ],\n                  ),\n                )\n              ],\n            ),\n          );\n        }\n        return MyProgressIndicator();\n      },\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我已经添加了整个代码。我收到以下错误。

\n

断言失败: 布尔表达式不能为 null\n导致错误的相关小组件为\nSwitch

\n

mrg*_*t96 6

如果您想访问 initState 中的状态,您将需要使用WidgetsBinding它来访问它。但是,使用它可以确保构建您的小部件,然后触发该方法来获取值。仅使用 BlocBuilder、Watch 或 Select 来获取您要查找的值会更快。

但要回答您的问题,您可以执行以下操作

  WidgetsBinding.instance.addPostFrameCallback((_) {
    final state = BlocProvider.of<UsersOwnProfileBloc>(context).state;
    if (state is FetchedUserSettingState) {
      publicAccount = state.userSettings.publicAccount;
    }
  });
Run Code Online (Sandbox Code Playgroud)