Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在mob商店更新和性能改进时防止颤振窗口小部件树重新招标_Android_Flutter_Dart_Mobx - Fatal编程技术网

Android 在mob商店更新和性能改进时防止颤振窗口小部件树重新招标

Android 在mob商店更新和性能改进时防止颤振窗口小部件树重新招标,android,flutter,dart,mobx,Android,Flutter,Dart,Mobx,我一直在尝试使用颤振构建一个应用程序,我很难理解颤振中的某些概念。我希望在这里找到一些答案 前言: 应用依赖项:抖动mobx、自动路由、获取它 我正在构建一个应用程序,需要在其中显示一些警报。我已经创建了一个颤振页面(AlertsScreen),该页面订阅了mobxalerts\u store。因此,每当我尝试将警报推送到警报\u存储区时,snackbar就会弹出。类似于我在React web中所做的事情 应用程序回购链接: 问题: 如何挂载将在应用程序中呈现的常见小部件,如AlertsScre

我一直在尝试使用颤振构建一个应用程序,我很难理解颤振中的某些概念。我希望在这里找到一些答案

前言: 应用依赖项:抖动mobx、自动路由、获取它

我正在构建一个应用程序,需要在其中显示一些警报。我已经创建了一个颤振页面(
AlertsScreen
),该页面订阅了mobxalerts\u store。因此,每当我尝试将警报推送到警报\u存储区时,snackbar就会弹出。类似于我在React web中所做的事情

应用程序回购链接:

问题:

  • 如何挂载将在应用程序中呈现的常见小部件,如
    AlertsScreen()
    。 早些时候,我曾经做过这样的事情:
  • app.dart()

    如何在整个应用程序中安装一个常见的小部件,如
    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();
              }
            },
          ),
        ];
      }