应用flutter写的电影播放软件:https://github.com/Mockingbird1234/skapp
开源不易,感兴趣的小伙伴给个star吧。
在flutter减少黑夜模式和换肤其实很简略,这里须要联合mobx一起应用,对于在flutter中应用mobx,能够参考我的这篇文章,https://www.jianshu.com/p/3bf5687c58c0。
实现原理就是在全局中存储以后皮肤模式,应用MaterialApp的theme属性实现换肤。
在store中定义模式
首先在store中定义全局变量,局部代码如下:
var colorList = [ Colors.red, Colors.pink, Colors.purple, Colors.lightBlue, Colors.cyan, Colors.teal, Colors.green, Colors.lime, Colors.amber, Colors.orange, Colors.deepOrange, Colors.blueGrey, ];Future getThemeIndex() async { SharedPreferences prefs = await SharedPreferences.getInstance(); int themeIndex = prefs.getInt('themeIndex') ?? 0; return themeIndex; }@observable Color theme; //在主题色@computed Brightness get themeMode { return isDark ? Brightness.dark : Brightness.light; }@observablebool isDark;
这里colorList用于寄存色彩,themeIndex应用SharedPreferences寄存色彩索引,独自定义isDark变量用于判断以后是否是暗黑模式。
应用Provider注入Global
接下来在main.dart中注入全局变量,局部代码如下:
runApp(RestartWidget( child: MultiProvider( providers: [ Provider<Global>( create: (_) => Global(prefs), ), ], child: MyApp(), ), ));@override Widget build(BuildContext context) { final Global _global = Provider.of<Global>(context); _global.getAppConfig(); _global.getAppAds(); Upgrader().clearSavedSettings(); // Upgrader().isUpdateAvailable(); final cfg = AppcastConfiguration(url: updataAppUrl, supportedOS: ['android']); _upgradeApp(_global); return Observer( builder: (_) => MaterialApp( theme: ThemeData( brightness: _global.themeMode, primarySwatch: _global.theme, platform: TargetPlatform.iOS, ), home: Scaffold( resizeToAvoidBottomPadding: false, backgroundColor: Theme.of(context).cardColor, body: _global.updataApp ? UpgradeAlert( appcastConfig: cfg, title: '发现新版本', prompt: '', showLater: false, showIgnore: false, buttonTitleUpdate: '立刻更新', debugAlwaysUpgrade: true, child: Center( child: Container( width: 0, height: 0, ), ) // debugLogging: true, ) : SplashWidget(), ), onGenerateRoute: Application.router.generator, navigatorObservers: [AppAnalysis()], ), ); }
应用final Global _global = Provider.of<Global>(context);
便能够获取在store中定义的变量以及变量的值。
实现换肤
以上只是初始化的时候展现的皮肤,接下来介绍如何通过点击实现动静换肤。
色彩抉择界面应用了flutter_material_color_picker: ^1.0.5
这个插件,局部代码如下:
MaterialColorPicker( elevation: 1, circleSize: 36, iconSelected: Icons.color_lens, allowShades: false, spacing: 16, onMainColorChange: (Color color) { _global.changeTheme(color); }, selectedColor: _global.theme, colors: _global.colorList, ),
次要看onMainColorChange办法,当点击了一个色彩后会执行此办法,触发_global.changeTheme(color);
执行,这些就实现了换肤性能。
以上只是列出了我在skapp我的项目中应用换肤的局部代码,具体实现能够到github下载源码学习交换:https://github.com/Mockingbird1234/skapp