Ali*_*zen 3 flutter bloc flutter-bloc
在构建器方法中,我达到了状态值,例如
\nreturn BlocBuilder<UsersOwnProfileBloc, UsersOwnProfileState>(\n cubit: widget.bloc,\n builder: (context, state) {\n if (state is FetchedUserSettingState) {\n bool account = state.userSettings.publicAccount\n}\n\nRun 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} \nRun Code Online (Sandbox Code Playgroud)\n谁能告诉我如何获取 initState 中的状态值?
\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n我已经添加了整个代码。我收到以下错误。
\n断言失败: 布尔表达式不能为 null\n导致错误的相关小组件为\nSwitch
\n如果您想访问 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)
| 归档时间: |
|
| 查看次数: |
7756 次 |
| 最近记录: |