Android 在mob商店更新和性能改进时防止颤振窗口小部件树重新招标
我一直在尝试使用颤振构建一个应用程序,我很难理解颤振中的某些概念。我希望在这里找到一些答案 前言: 应用依赖项:抖动mobx、自动路由、获取它 我正在构建一个应用程序,需要在其中显示一些警报。我已经创建了一个颤振页面(Android 在mob商店更新和性能改进时防止颤振窗口小部件树重新招标,android,flutter,dart,mobx,Android,Flutter,Dart,Mobx,我一直在尝试使用颤振构建一个应用程序,我很难理解颤振中的某些概念。我希望在这里找到一些答案 前言: 应用依赖项:抖动mobx、自动路由、获取它 我正在构建一个应用程序,需要在其中显示一些警报。我已经创建了一个颤振页面(AlertsScreen),该页面订阅了mobxalerts\u store。因此,每当我尝试将警报推送到警报\u存储区时,snackbar就会弹出。类似于我在React web中所做的事情 应用程序回购链接: 问题: 如何挂载将在应用程序中呈现的常见小部件,如AlertsScre
AlertsScreen
),该页面订阅了mobxalerts\u store。因此,每当我尝试将警报推送到警报\u存储区时,snackbar就会弹出。类似于我在React web中所做的事情
应用程序回购链接:
问题:
AlertsScreen()
。
早些时候,我曾经做过这样的事情:AlertsScreen
,它对于任何类型的活动都是可见的
2) stackoverflow的这一点建议将CommonWidget设为无状态widget,并在任何需要呈现的地方使用它。
因此,根据上面的答案,我修改了我的代码如下:
公共_widget.dart()
这样做对吗
3) 我使用flatter\u mobx作为AlertsScreen
的存储。由于我在多个屏幕中使用了CommonWidget来显示AlertsScreen
,因此每当我更新存储时,AlertsScreen都会多次重建。我如何防止这种情况?如何确保只在当前屏幕中重新呈现AlertsScreen
小部件,并在更新存储时防止它在其他任何地方重新构建
当前的解决方法如下所示:
alerts.dart()
@覆盖
void didChangeDependencies(){
super.didChangeDependencies();
_alertsStore???=Provider.of(上下文);
_处置者[
反应(
()=>_alertsStore.alertsList.iterator,
(警报列表){
如果(ModalRoute.of(context.isCurrent){//检查是否呈现当前屏幕
buildSnackbar();
}
},
),
];
}
有没有更好的办法
MaterialApp(
builder: (BuildContext context, Widget widget) {
setErrorBuilder();
return Column(
children: <Widget>[
Expanded(
child: widget,
),
AlertsScreen(),
],
);
},
title: 'App name',
onGenerateRoute: Router.onGenerateRoute,
initialRoute: Router.splashScreen,
navigatorKey: Router.navigator.key,
),
Flushbar(title: 'title',message: 'body',duration: const Duration(seconds: 5),).show(context);
class CommonWidget extends StatelessWidget {
final Widget child;
const CommonWidget({
@required this.child,
});
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Expanded(
child: child,
),
AlertsScreen(),
],
);
}
}
class _HomeScreenState extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: CommonWidget(
child: Center(
child: Column(),
),
),
);
}
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_alertsStore ??= Provider.of<AlertsStore>(context);
_disposers ??= [
reaction(
(_) => _alertsStore.alertsList.iterator,
(alertsList) {
if (ModalRoute.of(context).isCurrent) { // Check whether current screen is rendered
buildSnackbar();
}
},
),
];
}