Flutter网站实现深色主题无缝切换的最简单方法优化,主要针对ScrollView+GridView的使用场景,使用更合适的组件,本期想做一个主题的改变,为什么?首先,深色主题越来越死板。现在,任何没有暗黑破坏神的主流app都不好意思上架,而ios阵营对平台实现的要求更高。否则,它将被下架。第二个项目仍处于早期阶段。这时候重构修改的成本就比较低了。第三主题的改版网站上有很多可以快速实现的框架,但我想求的是最简单的实现。我不想介绍别人的框架。第二,你不需要依赖别人的升级来满足未来怪异的需求。这个问题的实现其实很简单,下面我们来看一下。大屏,浅色,大屏,深色,小屏,浅色,小屏,深色代码实现定义主题类AppTheme,用于配置不同的ThemeDataclassAppTheme{ThemeDatathemeData;AppTheme(this.themeData);//忽略:non_constant_identifier_namesstaticfinalAppThemeDARK_THEME=AppTheme(ThemeData.dark());//ignore:non_constant_identifier_namesstaticfinalAppThemeLIGHT_THEME=AppTheme(ThemeData(brightness:Brightness.light,primaryColor:Colors.grey[50]));}DARK_THEME深色主题LIGHT_THEME浅色主题,浅色标题栏默认为蓝色,以及这里我改成浅灰色来定义StreamController,用于动态改变数据类ThemeBloc{//ignore:close_sinksfinal_themeStreamController=StreamController();///更改主题调用方法getchangeTheTheme=>_themeStreamController.sink.add;///主题数据获取themeData=>_themeStreamController.stream;}finalbloc=ThemeBloc();在原来的MaterialAppStreamBuilder(initialData:AppTheme.LIGHT_THEME,stream:bloc.themeData,builder:(context,AsyncSnapshotsnapshot){returnMajor基础上增加一层StreamBuilderterialApp(title:'Jetpack',theme:snapshot.data.themeData,home:PageHome(),routes:{"/qq":(context)=>PageQQLink(),"/pageChatGroup":(context)=>PageChatGroup(),},);})initialData默认数据流给它赋值bloc.themeData,用于监听数据变化snapshot数据变化的snapshot最终交给MaterialApp主题,从而实现如何触发动态变化数据变化呢?如图在设置页面添加开关,代码如下SwitchListTile(secondary:Icon(_isEnabled?Icons.brightness_4:Icons.brightness_5),title:Text("Darktheme"),subtitle:Text("将主题转为深黑色"),value:_isEnabled,onChanged:(value){setState((){_isEnabled=value;});if(value){bloc.changeTheme(AppTheme.DARK_THEME);}else{bloc.changeTheme(AppTheme.LIGHT_THEME);}},)在这里调用bloc.changeTheme来改变主题。换主题就这么简单,有没有什么疑问,我怎么修改其他主题(比如:文本、按钮、对话框等)ThemeData再来看看。我必须实现staticfinalAppThemeLIGHT_THEME=AppTheme(ThemeData(brightness:Brightness.light,primaryColor:Colors.grey[50]));我这里修改了brightness和primaryColor,但是还有很多,请看ThemeData({Brightnessbrightness,VisualDensityvisualDensity,MaterialColorprimarySwatch,ColorprimaryColor,BrightnessprimaryColorBrightness,ColorprimaryColorLight,ColorprimaryColorDark,ColoraccentColor,BrightnessaccentColorBrightness,ColorcanvasColor,ColorscaffoldBackgroundColor,颜色bottomAppBarColor,颜色cardColor,ColordividerColor,ColorfocusColor,ColorhoverColor,ColorhighlightColor,ColorsplashColor,InteractiveInkFeatureFactorysplashFactory,ColorselectedRowColor,ColorunselectedWidgetColor,ColordisabledColor,ColorbuttonColor,ButtonThemeDatabuttonTheme,ToggleButtonsThemeDatatoggleButtonsTheme,ColorsecondaryHeaderColor,颜色textSelectionColor,颜色cursorColor,颜色textSelectionHandleColor,颜色backgroundColor,颜色dialogBackgroundColor,颜色indicatorColor,颜色hintColor,颜色errorColor,颜色toggleableActiveColor,字符串fontFamily,TextThemetextTheme,TextThemeprimaryTextTheme,TextThemeaccentTextTheme,InputDecorationThemeinputDecorationTheme,IconThemeDataiconTheme,IconThemeDataprimaryIconThemeIconThemeDataaccentIconTheme,SliderThemeDatasliderTheme,TabBarThemetabBarTheme,TooltipThemeDatatooltipTheme,CardThemecardTheme,ChipThemeDatachipTheme,TargetPlatformplatform,MaterialTapTargetSizematerialTapTargetSize,boolapplyElevationOverlayColor,PageTransitionsThemepageTransitionsTheme,AppBarThemeappBarTheme,BottomAppBarThemebottomAppBarTheme,ColorSchemecolorScheme,DialogThemedialogTheme,FloatingActionButtonThemeDatafloatingActionButtonTheme,NavigationRailThemeDatanavigationRailTheme,Typographytypography,CupertinoThemeDatacupertinoOverrideTheme,SnackBarThemeDatasnackBarTheme,BottomSheetThemeDatabottomSheetTheme,PopupMenuThemeDatapopupMenuTheme,MaterialBannerThemeDatabannerTheme,DividerThemeDatadividerTheme,ButtonBarThemeDatabuttonBarTheme,}这里面得主题你都可以修改,你是不是看到了AppBarTheme、DialogTheme、TextTheme,BottomSheetThemeData等等,我就不用解释了。你应该知道谁得到了这种风格。把新加的代码总结20行就搞定了。为什么要用别人的框架?正确的。啰嗦一句,计划实在赶不上变化,不要着急,慢慢完善就好。请将源码转至github代码查看ToDo的完整实现。这部分内容后面会慢慢更新给大家。请客观,不要担心。你当然可以参与,私聊我就好。example部门正在准备接下来的实现,跳转到详情页面,展示用例。源码已经完成,可以点击跳转到github。Tags部分会在下一期实现,这部分也需要新的UI展示。标签的功能类似于搜索,提供了一种更快地找到所需功能的方法。对于消息功能的设计,你在使用过程中肯定会有不同的建议。有了这个功能,就可以知道自己的声音了,所以这也是我们需要实现的一个功能。优秀项目推荐,还有很多优秀的项目等着我们去发现,我一个人的能力有限,如果有更多的人来推荐,我们会继续丰富我们的Jetpack内容。博客,考虑到有很多优秀的高手写过相关的技术博客,帮你找到最好的资源。功能设计如下图添加一个按钮。jetpack.net.cn网站结束,欢迎常来,希望能在你学习Flutter的路上提供一点帮助。