放在颤振块中
Posted
技术标签:
【中文标题】放在颤振块中【英文标题】:dispose in flutter bloc 【发布时间】:2020-11-22 14:19:43 【问题描述】:在下面的代码中, profileBloc 在 EditProfileScreenState 的 didChangeDependencies() 方法中初始化。
我们应该调用 EditProfileScreenState 类的 dispose 方法来处理 profileBloc 吗?
如果是这样,profileBloc方法应该如何处理,因为ProfileBloc类扩展了没有dispose方法的Bloc类?
class Profile extends StatelessWidget
@override
Widget build(BuildContext context)
return BlocProvider(
create: (BuildContext context) => ProfileBloc(AuthRepo()),
child: ProfileScreen(),
);
class ProfileScreen extends StatefulWidget
@override
EditProfileScreenState createState() => EditProfileScreenState();
class EditProfileScreenState extends State<ProfileScreen>
ProfileBloc profileBloc;
@override
void didChangeDependencies()
profileBloc = BlocProvider.of<ProfileBloc>(context);
super.didChangeDependencies();
@override
void dispose()
// TODO: implement dispose
//profileBloc.dispose() cannot call as ProfileBloc class doesn't have dispose method
super.dispose();
@override
Widget build(BuildContext context)
return Scaffold(
body: BlocConsumer<ProfileBloc, ProfileState>(
listener: (context, state)
,
builder: (BuildContext context,ProfileState state)
return RaisedButton(onPressed: ()=>profileBloc.add(SaveProfile("name","email")));
));
class ProfileBloc extends Bloc<ProfileEvent, ProfileState>
AuthRepo authRepo;
ProfileBloc(this.authRepo) : super(ProfileSaved());
@override
Stream<ProfileState> mapEventToState(ProfileEvent event) async*
if (event is SaveProfile)
//Actions
【问题讨论】:
只有当您使用 BlocProvider 创建 bloc 时才会释放 bloc,并且在从小部件树中卸载 BlocProvider 时才会释放 bloc。希望有帮助 【参考方案1】:在搜索过程中,我找到了解决方案。
我们不需要在 didChangeDependencies() 中初始化 profileBloc。
我们可以使用以下命令直接从 BlocProvider 访问 add 方法:
BlocProvider.of<ProfileBloc>(context).add(ProfileSaved())
我们可以从 EditProfileScreenState 类中删除以下部分。
ProfileBloc profileBloc;
@override
void didChangeDependencies()
profileBloc = BlocProvider.of<ProfileBloc>(context);
super.didChangeDependencies();
此外, 在 ProfileBloc 类中,如果我们需要取消任何流,我们可以使用 close 方法。
@override
Future<void> close()
//cancel streams
super.close();
【讨论】:
您忘记在 @override Future以上是关于放在颤振块中的主要内容,如果未能解决你的问题,请参考以下文章
我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?
您可以将 CREATE TABLE 语句放在 PL/SQL 块中吗?