放在颤振块中

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 close() 中返回“Future 必须放“async”... 未来 close() async ...

以上是关于放在颤振块中的主要内容,如果未能解决你的问题,请参考以下文章

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?

您可以将 CREATE TABLE 语句放在 PL/SQL 块中吗?

如何取消颤振/飞镖集团中的“等待”

加载颤振时消除图像中的白色闪烁

解释为什么wait()和notify(), notifyAll()要放在同步块中

java中哪块代码或说什么代码应该放在try块中呢?