最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Flutter statusbar color is not changing in ios - Stack Overflow

programmeradmin5浏览0评论

I want to use light status bar to some of my screens and need to set it back to dark statusbar when navigate from those screens. I made a widget and wrapped those screens for it. It works for android and not for ios. I dont need to use appbar and annoted region

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class LightStatusBarWidget extends ConsumerStatefulWidget {
    final VoidCallback? onPop;
    final Widget child;
    final bool didReplace;

    const LightStatusBarWidget({
        super.key,
        required this.child,
        this.onPop,
        this.didReplace = true,
    });

    @override
    ConsumerState<ConsumerStatefulWidget> createState() =>    _LightStatusBarWidgetState();
}

class _LightStatusBarWidgetState extends ConsumerState<LightStatusBarWidget> {
    @override
    void initState() {
        super.initState();
        SystemChrome.setEnabledSystemUIMode(
            SystemUiMode.manual,
            overlays: [SystemUiOverlay.top],
        );
        WidgetsBinding.instance.addPostFrameCallback((_) {
            setStatusBarColor(isLight: true);
        });
    }

    @override
    void dispose() {
        WidgetsBinding.instance.addPostFrameCallback((_) {
            setStatusBarColor(isLight: widget.didReplace ? false : true);
        });
        super.dispose();
    }

    void setStatusBarColor({bool isLight = false}) {
        SystemChrome.setSystemUIOverlayStyle(
            SystemUiOverlayStyle(
                statusBarColor: isLight ? Colors.white : Colors.black,
                 statusBarIconBrightness: isLight ? Brightness.dark :     Brightness.light,
                statusBarBrightness: isLight ? Brightness.light : Brightness.dark,
            ),
         );
   }

    @override
    Widget build(BuildContext context) {
        return PopScope(
            onPopInvokedWithResult: (didPop, result) {
                setStatusBarColor(isLight: false);
                widget.onPop?.call();
            },
            child: SafeArea(child: widget.child),
        );
    }
}

I want to use light status bar to some of my screens and need to set it back to dark statusbar when navigate from those screens. I made a widget and wrapped those screens for it. It works for android and not for ios. I dont need to use appbar and annoted region

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class LightStatusBarWidget extends ConsumerStatefulWidget {
    final VoidCallback? onPop;
    final Widget child;
    final bool didReplace;

    const LightStatusBarWidget({
        super.key,
        required this.child,
        this.onPop,
        this.didReplace = true,
    });

    @override
    ConsumerState<ConsumerStatefulWidget> createState() =>    _LightStatusBarWidgetState();
}

class _LightStatusBarWidgetState extends ConsumerState<LightStatusBarWidget> {
    @override
    void initState() {
        super.initState();
        SystemChrome.setEnabledSystemUIMode(
            SystemUiMode.manual,
            overlays: [SystemUiOverlay.top],
        );
        WidgetsBinding.instance.addPostFrameCallback((_) {
            setStatusBarColor(isLight: true);
        });
    }

    @override
    void dispose() {
        WidgetsBinding.instance.addPostFrameCallback((_) {
            setStatusBarColor(isLight: widget.didReplace ? false : true);
        });
        super.dispose();
    }

    void setStatusBarColor({bool isLight = false}) {
        SystemChrome.setSystemUIOverlayStyle(
            SystemUiOverlayStyle(
                statusBarColor: isLight ? Colors.white : Colors.black,
                 statusBarIconBrightness: isLight ? Brightness.dark :     Brightness.light,
                statusBarBrightness: isLight ? Brightness.light : Brightness.dark,
            ),
         );
   }

    @override
    Widget build(BuildContext context) {
        return PopScope(
            onPopInvokedWithResult: (didPop, result) {
                setStatusBarColor(isLight: false);
                widget.onPop?.call();
            },
            child: SafeArea(child: widget.child),
        );
    }
}
Share Improve this question asked yesterday Vinaya AugusthyVinaya Augusthy 315 bronze badges New contributor Vinaya Augusthy is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
Add a comment  | 

1 Answer 1

Reset to default 2

Check with this code:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class LightStatusBarWidget extends ConsumerStatefulWidget {
  final VoidCallback? onPop;
  final Widget child;
  final bool didReplace;

  const LightStatusBarWidget({
    super.key,
    required this.child,
    this.onPop,
    this.didReplace = true,
  });

  @override
  ConsumerState<ConsumerStatefulWidget> createState() => _LightStatusBarWidgetState();
}

class _LightStatusBarWidgetState extends ConsumerState<LightStatusBarWidget> {
  @override
  void initState() {
    super.initState();
    SystemChrome.setEnabledSystemUIMode(
      SystemUiMode.manual,
      overlays: [SystemUiOverlay.top],
    );
    WidgetsBinding.instance.addPostFrameCallback((_) {
      setStatusBarColor(isLight: true);
    });
  }

  @override
  void dispose() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      setStatusBarColor(isLight: widget.didReplace ? false : true);
    });
    super.dispose();
  }

  void setStatusBarColor({bool isLight = false}) {
    if (Theme.of(context).platform == TargetPlatform.iOS) {
      // Handle iOS-specific status bar style
      SystemChrome.setSystemUIOverlayStyle(
        SystemUiOverlayStyle(
          statusBarColor: Colors.transparent, // Transparent to avoid overlay color issues on iOS
          statusBarIconBrightness: isLight ? Brightness.dark : Brightness.light,
          statusBarBrightness: isLight ? Brightness.light : Brightness.dark,
        ),
      );
    } else {
      // Handle Android-specific status bar style
      SystemChrome.setSystemUIOverlayStyle(
        SystemUiOverlayStyle(
          statusBarColor: isLight ? Colors.white : Colors.black,
          statusBarIconBrightness: isLight ? Brightness.dark : Brightness.light,
          statusBarBrightness: isLight ? Brightness.light : Brightness.dark,
        ),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return PopScope(
      onPopInvokedWithResult: (didPop, result) {
        setStatusBarColor(isLight: false);
        widget.onPop?.call();
      },
      child: SafeArea(child: widget.child),
    );
  }
}
发布评论

评论列表(0)

  1. 暂无评论