首页 > 其他分享 >Flutter 底部(手势条)和顶部导航栏沉浸适配多主题

Flutter 底部(手势条)和顶部导航栏沉浸适配多主题

时间:2024-07-16 13:42:17浏览次数:13  
标签:沉浸 const Color 适配 dart Colors ThemeData Flutter themeData

适配原理

顶部导航栏和状态栏沉浸实现比较简单,设置Scaffold的AppBar背景色即可,其中surfaceTintColor可以设置IOS滑动之后状态栏颜色,不想要显示顶部导航栏高度设置toolbarHeight:0,阴影设置elevation: 0

@override
Widget build(BuildContext context) {
  var bg = Theme.of(context).colorScheme.surface;
  return Scaffold(
    appBar: AppBar(
      elevation: 0,
      toolbarHeight: 0,
      backgroundColor: bg,
      surfaceTintColor: bg,
    ),
    backgroundColor: bg,
  )
}

底部导航栏即手势条,也叫小白条。IOS不需要特别适配,设置colorSchemesurface背景即可。

ThemeData lightMode = ThemeData(
  useMaterial3: true,
  colorScheme: const ColorScheme.light(
    surface: Color.fromARGB(255, 242, 247, 251),
  ),
);

适配代码

Android底部手势条需要特别适配,下面的代码同样适用于IOS

亮色主题

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

ThemeData lightMode = ThemeData(
  useMaterial3: true,
  // 沉浸的关键代码
  appBarTheme: const AppBarTheme(
    systemOverlayStyle: SystemUiOverlayStyle(
      statusBarColor: Colors.transparent, // 去除状态栏遮罩
      statusBarIconBrightness: Brightness.dark, // 状态栏图标字体颜色
      systemNavigationBarColor: Color.fromARGB(255, 242, 247, 251), // 底部导航栏颜色
    )
  ),
  colorScheme: const ColorScheme.light(
    surface: Color.fromARGB(255, 242, 247, 251), // 和底部导航栏保持一致
    surfaceBright: Color(0x00FFFFFF), // 透明背景
    primary: Color.fromARGB(255, 89, 54, 133),
    secondary: Color(0xFFE3EDF2),
    tertiary: Colors.black,
    onSecondary: Colors.black,
    secondaryContainer: Color(0xFFE3EDF2), // 骨架屏底色
    onSecondaryContainer: Color.fromARGB(255, 242, 247, 251), // 骨架屏亮色
    inversePrimary: Colors.black54,
  ),
);

暗色主题

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

ThemeData darkMode = ThemeData(
  useMaterial3: true,
  // 沉浸的关键代码
  appBarTheme: const AppBarTheme(
    systemOverlayStyle: SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      statusBarIconBrightness: Brightness.light,
      systemNavigationBarColor: Color(0xFF121012),  // 和主背景surface保持一致
    )
  ),
  colorScheme: const ColorScheme.dark(
    surface: Color(0xFF121012), 
    surfaceBright: Color(0x00000000), // 透明背景
    primary: Color.fromARGB(255, 89, 54, 133),
    secondary: Color(0xFF382C3E),
    tertiary: Colors.white,
    onSecondary: Colors.white30, // 骨架屏底色
    secondaryContainer: Color.fromARGB(255, 12, 11, 12), // 骨架屏亮色
    onSecondaryContainer: Colors.black26,
    inversePrimary: Colors.white54,
  ),
);

使用Provider

你需要安装 provider

flutter pub add provider

动态切换代码

import 'package:flutter/material.dart';
import 'package:video_app/theme/dark_theme.dart';
import 'package:video_app/theme/light_theme.dart';

class ThemeProvider extends ChangeNotifier {
  ThemeData _themeData = lightMode;

  ThemeData get themeData => _themeData;

  ThemeData get darkTheme => darkMode;
  ThemeData get lightTheme => lightMode;

  set themeData(ThemeData themeData) {
    _themeData = themeData;
    notifyListeners();
  }

  void toggleTheme() {
    if (_themeData == lightMode) {
      themeData = darkMode;
    } else {
      themeData = lightMode;
    }
  }
}

主题设置

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
      designSize: designSize,
      builder: (context, child) {
        return MaterialApp(
          theme: Provider.of<ThemeProvider>(context).themeData, // 动态主题
          darkTheme: Provider.of<ThemeProvider>(context).darkTheme, // 暗色主题,设置后不能手动切换
          home: const RootScreen(),
          debugShowCheckedModeBanner: false,
        );
      },
    );
  }
}

标签:沉浸,const,Color,适配,dart,Colors,ThemeData,Flutter,themeData
From: https://www.cnblogs.com/sw-code/p/18305045

相关文章

  • Flutter学习01-Flutter学习路线
    Flutter是由Google开发的一套开源UI软件开发工具包,能够帮助开发者使用一套代码库创建跨平台的高性能原生应用。Flutter使用Dart编程语言,通过其内置的渲染引擎绘制界面,从而实现了原生性能和优秀的用户体验。Flutter的特点跨平台:支持iOS、Android、Web和桌面平台,不同......
  • flutter中监听键盘
    使用 Focus 和 onKeyclassCategoryViewextendsGetView<CategoryController>{constCategoryView({Key?key}):super(key:key);@overrideWidgetbuild(BuildContextcontext){finalFocusNode_focusNode=FocusNode();returnScaffold......
  • 前端学习-flutter学习-010-按钮
    《Flutter实战·第二版》ElevatedButton(child:Text("ElevatedButton默认带有阴影和灰色背景。按下后,阴影会变大"),onPressed:(){},),TextButton(child:Text("TextButton默认背景透明并不带阴影。按下后,会有背景色"),onPressed:(){},),......
  • 前端学习-flutter学习-009-文本及样式
    《Flutter实战·第二版》TextTextAlign:leftrightcenter注意点:对齐的参考系是Textwidget本身,如果文本不够长,设置看起来是没有生效的;文本长才看得到,字符串内容超过一行,Text宽度等于屏幕宽度,第二行文本便会居中显示。maxLines、overflow:指定文本显示的最大行数,默认情况下,......
  • flutter pub get 的时候:A dependency specification must be a string or a mapping.
    想在pubspec.yaml文件中添加字体:报错了fonts:-family:MiaoZifonts:-asset:assets/fonts/MiaoZi-YunYingTi-2.ttfweight:500看了这篇文章解决了我原来是加在dependencies:flutter:sdk:flutter#新添加的依赖fonts:......
  • 前端大屏适配方案汇总
    ......
  • JAVA设计模式>>结构型>>适配器模式
    本文介绍23种设计模式中结构型模式的适配器模式目录1. 适配器模式1.1 基本介绍1.2 工作原理 1.3  适配器模式的注意事项和细节1.4  类适配器模式1.4.1 类适配器模式介绍1.4.2 应用实例 1.4.3注意事项和细节1.5 对象适配器模式1.5.1 基本介绍1......
  • java 生成mapbox-gl 可以直接使用的雪碧图,包含对应json,图片大小无限制自动适配
    1、文件路径配置sprite-path:/home/mapplate/sprite/2、实现类packagecom.shgis.service.impl;/***CreatedbyAdministratoron2021/10/9.*/importcom.alibaba.fastjson.JSONObject;importcom.shgis.config.FileProperties;importcom.shgis.entity.Ebuf......
  • C# 适配大华TM-F条码秤
    背景大华条码秤(TM-F),使用了自己的私有协议。在对接过程中,将PLU信息部分的转义和解析进行了封装。基础信息首先,为适配将来更多的条码秤,抽象PLU的基本信息作为基类。基类为充血模型,包含了信息转报文和报文解析信息的方法。publicclassBasePLU{///<summary>///......
  • 学习ArkTS遇到的的兼容与适配案例
    案例相册选择的API(如下)在Mate30上无法支持letphotoPicker=newpicker.PhotoViewPicker();photoPicker.select({}).then(()=>{});虽然在2024/06Mate30的系统已经可以更新到4.2版本但是仍旧无法使用此API,然而同是麒麟990芯片的P40是可以正常执行的官......