Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Flutter 更改每个屏幕的状态栏颜色_Flutter_Statusbar - Fatal编程技术网

Flutter 更改每个屏幕的状态栏颜色

Flutter 更改每个屏幕的状态栏颜色,flutter,statusbar,Flutter,Statusbar,我想为每个屏幕设置状态栏颜色。 例如,在屏幕A中,状态栏颜色为红色,而在屏幕B中,状态栏颜色为蓝色。 我尝试了很多解决办法。但每个人都有自己的问题。 比如: Routing.pushNamedAndRemoveUntil( context: context, route: Routes.homeScreen, arguments: user, statusBarColor: Colors.teal, ); 或在生成方法中返回之前执行以下操作: SystemChr

我想为每个屏幕设置状态栏颜色。 例如,在屏幕A中,状态栏颜色为红色,而在屏幕B中,状态栏颜色为蓝色。 我尝试了很多解决办法。但每个人都有自己的问题。 比如:

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
或在生成方法中返回之前执行以下操作:

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
  statusBarColor: Colors.white
));
Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
我的最后一次尝试:

  static void pushNamed({
    BuildContext context,
    String route,
    Object arguments,
    Color statusBarColor,
    Color navigationBarColor = Colors.black,
  }) async {
    if (statusBarColor != null) {
      await FlutterStatusbarcolor.setStatusBarColor(statusBarColor);
    }
    await Navigator.pushNamed(
      context,
      route,
      arguments: arguments,
    );
  }
Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
但有时会失败。 这个解决方案的另一个问题是当使用back按钮时,颜色并没有改变。(我在appbar中为back按钮编写代码)。 即使在热重新加载时,颜色也会更改为以前的颜色。 我如何处理这个问题

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
更新#2

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
我为我的路由创建了一个类

static void pushNamedAndRemoveUntil({
    BuildContext context,
    String route,
    Object arguments,
    Color statusBarColor,
    Color popStatucBarColor,
    Color popNavigationBarColor,
    Color navigationBarColor,
}) async {
    changeSystemColor(statusBarColor, navigationBarColor);
    Navigator.pushNamedAndRemoveUntil(
        context,
        route,
        (Route<dynamic> route) => false,
        arguments: arguments,
    ).then((res) {
        changeSystemColor(popStatucBarColor, popNavigationBarColor);
    });
}
Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
使用这个

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
现在使用PushName和RemoveUntil时不起作用。

您可以使用AppBar,但将其高度和高程设置为0,使其仅覆盖状态栏,并且没有阴影

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
appBar: PreferredSize(
                preferredSize: Size.fromHeight(0),
                child: new AppBar(
                        brightness: Brightness.light,
                        backgroundColor: backgroundColour,
                        elevation: 0,
                )
),
然后在
initState()
中,可以使状态栏透明,这样它就不会变色

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
您需要在调用
wait Navigator.push()之前和之后调用此函数

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
   statusBarColor: desiredColour
));
可以使用AppBar,但可以将其高度和高程设置为0,以便它仅覆盖状态栏而没有阴影

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
appBar: PreferredSize(
                preferredSize: Size.fromHeight(0),
                child: new AppBar(
                        brightness: Brightness.light,
                        backgroundColor: backgroundColour,
                        elevation: 0,
                )
),
然后在
initState()
中,可以使状态栏透明,这样它就不会变色

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
您需要在调用
wait Navigator.push()之前和之后调用此函数

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
   statusBarColor: desiredColour
));

您不能在initState或任何其他有状态小部件生命周期方法上触发系统颜色更改。最好的方法似乎是在导航到新视图之前以及从该视图返回时设置颜色:

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
void goToWhiteView(){
  changeSystemColor(Colors.white);
  Navigator.pushNamed(
    context,
    route,
    arguments: arguments,
  ).then((result){
    changeSystemColor(Colors.blue);
  });
}

void changeSystemColor(Color color){
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: color,
    statusBarColor: color
  ));
}

您不能在initState或任何其他有状态小部件生命周期方法上触发系统颜色更改。最好的方法似乎是在导航到新视图之前以及从该视图返回时设置颜色:

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
void goToWhiteView(){
  changeSystemColor(Colors.white);
  Navigator.pushNamed(
    context,
    route,
    arguments: arguments,
  ).then((result){
    changeSystemColor(Colors.blue);
  });
}

void changeSystemColor(Color color){
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: color,
    statusBarColor: color
  ));
}

我创建ScreenCainer小部件并用它包装我的屏幕:

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
    return AnnotatedRegion<SystemUiOverlayStyle>(
      value: SystemUiOverlayStyle(
        statusBarColor: statusbarcolor ?? ColorPalette.accent,
        statusBarIconBrightness: statusBarIconBrightness ?? Brightness.light,
      ),
      child: child,
    );
return注释区域(
值:SystemUIOverlyStyle(
statusBarColor:statusBarColor??ColorPalette.accent,
statusBarIconBrightness:statusBarIconBrightness??Brightness.light,
),
孩子:孩子,
);

我创建ScreenContainer小部件并用它包装我的屏幕:

Routing.pushNamedAndRemoveUntil(
    context: context,
    route: Routes.homeScreen,
    arguments: user,
    statusBarColor: Colors.teal,
);
    return AnnotatedRegion<SystemUiOverlayStyle>(
      value: SystemUiOverlayStyle(
        statusBarColor: statusbarcolor ?? ColorPalette.accent,
        statusBarIconBrightness: statusBarIconBrightness ?? Brightness.light,
      ),
      child: child,
    );
return注释区域(
值:SystemUIOverlyStyle(
statusBarColor:statusBarColor??ColorPalette.accent,
statusBarIconBrightness:statusBarIconBrightness??Brightness.light,
),
孩子:孩子,
);

@Eugene有些屏幕没有appbar,而且在使用appbar时,状态栏的颜色比appbar的颜色暗。你有什么解决方案吗?@SumitShukla我发布了我的解决方法。这可能不是最好的解决方案,大多数情况下都能正常工作。@Eugene有些屏幕没有appbar,而且在使用appbar时,状态栏的颜色比appbar的颜色暗。你有什么解决方案吗?@SumitShukla我发布了我的解决方法。这可能不是最好的解决方案,它在大多数情况下都是有效的。它不起作用!颜色是从第一个屏幕与您的代码。它不工作!颜色来自您的代码的第一个屏幕。它检查它,但有时失败,颜色与前一个屏幕相同。您可以分享您是如何实现它的吗?它检查它,但有时失败,颜色与前一个屏幕相同。您可以分享您是如何实现它的吗?