Flutter-使用一次性的Bloc将StatefulWidget转换为HookWidget

时间:2020-05-13 14:10:13

标签: flutter flutter-dependencies flutter-hooks

几周前,我读到了flutter hooks的内容,现在想在我的新项目中实现它。我的“基础”窗口小部件是一种有状态的窗口小部件,由于某些项目原因,其混合RouteAware是引起问题的原因。此外,每个都有一个提供BehaviourSubject的团体。组件必须由Widget处置,这就是RouteAware及其StatefulWidget的原因和原因。我在这里没有详细介绍,但是该区块具有很多依赖关系,并且像MyWidget(bloc://在这里解析区块)这样传递。

有人可以在这里帮助我将其转换为HookWidget以及如何添加useAware挂钩吗?

class MyBloc{

 void dispose(){}

 void didPopNext(){}

 void didPush(){}


}

class MyWidget extends StatefulWidget{

  final MyBloc bloc;

  MyWidget({key, this.bloc}) : super(key: key);

  @override
  MyWidgetState createState() => MyWidgetState();


}


class MyWidgetState extends State<MyWidget> with RouteAware{

@override
  void didChangeDependencies() {
    super.didChangeDependencies();
    routeObserver.subscribe(this, ModalRoute.of(context));
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    widget.bloc.dispose();
    super.dispose();
  }

  @override
  void didPush() {
    // Route was pushed onto navigator and is now topmost route.
    widget.bloc.didPush();
  }

  @override
  void didPopNext() {
    // Covering route was popped off the navigator.
    widget.bloc.didPopNext();
  }

  @override
  Widget build(BuildContext context) => StreamBuilder(stream: widget.bloc.myStream, initialValue: widget.bloc.myStream.value, builder: (context, snapshot){

//work with snapshot

});

} 

1 个答案:

答案 0 :(得分:1)

要使用钩子调用 dispose 方法,您可以使用 useEffect 钩子,其中函数的返回是您要用于处置的方法

useEffect((){   
   return bloc.dispose
}, const [])