From dad9bfc728a92de2dc1d0a0add4d9fd606d89d53 Mon Sep 17 00:00:00 2001 From: LollipopKit <2036293523@qq.com> Date: Tue, 26 Oct 2021 13:21:52 +0800 Subject: [PATCH] Completely apply theme to app --- lib/app.dart | 48 ++++++++++++++++++++++++++- lib/data/provider/server.dart | 9 +++++ lib/data/res/color.dart | 4 +++ lib/view/page/convert.dart | 11 ++++-- lib/view/page/home.dart | 13 +------- lib/view/page/private_key/edit.dart | 13 +++----- lib/view/page/private_key/stored.dart | 7 +++- lib/view/page/server/edit.dart | 11 +++--- lib/view/widget/input_decoration.dart | 13 ++++++++ 9 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 lib/view/widget/input_decoration.dart diff --git a/lib/app.dart b/lib/app.dart index 274af118..0db5c6ad 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -6,6 +6,21 @@ import 'package:toolbox/view/page/home.dart'; class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); + MaterialStateProperty getMaterialStateColor(Color primaryColor) { + return MaterialStateProperty.resolveWith((states) { + const Set interactiveStates = { + MaterialState.pressed, + MaterialState.hovered, + MaterialState.focused, + MaterialState.selected + }; + if (states.any(interactiveStates.contains)) { + return primaryColor; + } + return null; + }); + } + // This widget is the root of your application. @override Widget build(BuildContext context) { @@ -13,6 +28,7 @@ class MyApp extends StatelessWidget { valueListenable: locator().primaryColor.listenable(), builder: (_, value, __) { final primaryColor = Color(value); + final textStyle = TextStyle(color: primaryColor); return MaterialApp( title: 'ToolBox', theme: ThemeData( @@ -22,8 +38,38 @@ class MyApp extends StatelessWidget { FloatingActionButtonThemeData(backgroundColor: primaryColor), iconTheme: IconThemeData(color: primaryColor), primaryIconTheme: IconThemeData(color: primaryColor), + switchTheme: SwitchThemeData( + thumbColor: getMaterialStateColor(primaryColor), + trackColor: + getMaterialStateColor(primaryColor.withOpacity(0.7)), + ), + buttonTheme: ButtonThemeData(splashColor: primaryColor), + inputDecorationTheme: InputDecorationTheme( + labelStyle: textStyle, + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor))), + radioTheme: RadioThemeData( + fillColor: getMaterialStateColor(primaryColor)), ), - darkTheme: ThemeData.dark().copyWith(primaryColor: primaryColor), + darkTheme: ThemeData.dark().copyWith( + primaryColor: primaryColor, + appBarTheme: AppBarTheme(backgroundColor: primaryColor), + floatingActionButtonTheme: + FloatingActionButtonThemeData(backgroundColor: primaryColor), + iconTheme: IconThemeData(color: primaryColor), + primaryIconTheme: IconThemeData(color: primaryColor), + switchTheme: SwitchThemeData( + thumbColor: getMaterialStateColor(primaryColor), + trackColor: + getMaterialStateColor(primaryColor.withOpacity(0.7)), + ), + buttonTheme: ButtonThemeData(splashColor: primaryColor), + inputDecorationTheme: InputDecorationTheme( + labelStyle: textStyle, + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor))), + radioTheme: RadioThemeData( + fillColor: getMaterialStateColor(primaryColor))), home: MyHomePage(primaryColor: primaryColor), ); }); diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 529a6cea..826037c1 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -111,7 +111,16 @@ class ServerProvider extends BusyProvider { final time2 = DateTime.now(); logger.info( 'Connected to [${info.name}] in [${time2.difference(time1).toString()}].'); + } else { + try { + await client.execute('ls'); + } catch (e) { + await client.connect(); + logger.warning('[${info.name}] has error: $e \nTrying to reconnect.'); + rethrow; + } } + final cpu = await client.execute( "top -bn1 | grep load | awk '{printf \"%.2f\", \$(NF-2)}'") ?? '0'; diff --git a/lib/data/res/color.dart b/lib/data/res/color.dart index d94476a3..5dbeafe9 100644 --- a/lib/data/res/color.dart +++ b/lib/data/res/color.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; import 'package:toolbox/core/utils.dart'; +import 'package:toolbox/data/store/setting.dart'; +import 'package:toolbox/locator.dart'; + +Color primaryColor = Color(locator().primaryColor.fetch()!); class DynamicColor { /// 白天模式显示的颜色 diff --git a/lib/view/page/convert.dart b/lib/view/page/convert.dart index f3e9f7ba..30e8cbb1 100644 --- a/lib/view/page/convert.dart +++ b/lib/view/page/convert.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:toolbox/data/res/color.dart'; class ConvertPage extends StatefulWidget { const ConvertPage({Key? key}) : super(key: key); @@ -103,6 +104,8 @@ class _ConvertPageState extends State return Card( child: ExpansionTile( leading: TextButton( + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all(primaryColor)), child: SizedBox( width: _media.size.width * 0.3, child: Row( @@ -115,11 +118,15 @@ class _ConvertPageState extends State _textEditingControllerResult.text = temp; }, ), - title: SizedBox( + title: const SizedBox(), + trailing: SizedBox( width: _media.size.width * 0.4, child: Text( _typeOption[_typeOptionIndex], - style: const TextStyle(fontSize: 16.0, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w500, + color: primaryColor), ), ), children: _typeOption diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 6ecb73d6..9624152e 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -102,18 +102,7 @@ class _MyHomePageState extends State Widget _buildIcon() { return ConstrainedBox( constraints: const BoxConstraints(maxHeight: 60, maxWidth: 60), - child: Stack( - children: [ - Center( - child: Container( - color: Colors.white, - height: 37, - width: 37, - ), - ), - Image.asset('assets/app_icon.jpg'), - ], - ), + child: Image.asset('assets/app_icon.jpg'), ); } diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart index 78537944..5950b9a5 100644 --- a/lib/view/page/private_key/edit.dart +++ b/lib/view/page/private_key/edit.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:toolbox/data/model/private_key_info.dart'; import 'package:toolbox/data/provider/private_key.dart'; import 'package:toolbox/locator.dart'; +import 'package:toolbox/view/widget/input_decoration.dart'; class PrivateKeyEditPage extends StatefulWidget { const PrivateKeyEditPage({Key? key, this.info}) : super(key: key); @@ -46,7 +47,7 @@ class _PrivateKeyEditPageState extends State TextField( controller: nameController, keyboardType: TextInputType.text, - decoration: _buildDecoration('Name', icon: Icons.info), + decoration: buildDecoration('Name', icon: Icons.info), ), TextField( controller: keyController, @@ -54,14 +55,14 @@ class _PrivateKeyEditPageState extends State minLines: 3, maxLines: 10, keyboardType: TextInputType.text, - decoration: _buildDecoration('Private Key', icon: Icons.vpn_key), + decoration: buildDecoration('Private Key', icon: Icons.vpn_key), ), TextField( controller: pwdController, autocorrect: false, keyboardType: TextInputType.text, obscureText: true, - decoration: _buildDecoration('Password', icon: Icons.password), + decoration: buildDecoration('Password', icon: Icons.password), ), ], ), @@ -81,12 +82,6 @@ class _PrivateKeyEditPageState extends State ); } - InputDecoration _buildDecoration(String label, - {TextStyle? textStyle, IconData? icon}) { - return InputDecoration( - labelText: label, labelStyle: textStyle, icon: Icon(icon)); - } - @override void afterFirstLayout(BuildContext context) { if (widget.info != null) { diff --git a/lib/view/page/private_key/stored.dart b/lib/view/page/private_key/stored.dart index f3c9b12a..e12f9cf3 100644 --- a/lib/view/page/private_key/stored.dart +++ b/lib/view/page/private_key/stored.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/provider/private_key.dart'; +import 'package:toolbox/data/res/color.dart'; import 'package:toolbox/view/page/private_key/edit.dart'; import 'package:toolbox/view/widget/round_rect_card.dart'; @@ -13,6 +14,7 @@ class StoredPrivateKeysPage extends StatefulWidget { } class _PrivateKeyListState extends State { + final _textStyle = TextStyle(color: primaryColor); @override Widget build(BuildContext context) { return Scaffold( @@ -40,7 +42,10 @@ class _PrivateKeyListState extends State { PrivateKeyEditPage(info: key.infos[idx]), 'private key edit page') .go(context), - child: const Text('Edit')) + child: Text( + 'Edit', + style: _textStyle, + )) ], )); }) diff --git a/lib/view/page/server/edit.dart b/lib/view/page/server/edit.dart index 6e3999b2..c42008e6 100644 --- a/lib/view/page/server/edit.dart +++ b/lib/view/page/server/edit.dart @@ -8,6 +8,7 @@ import 'package:toolbox/data/provider/private_key.dart'; import 'package:toolbox/data/provider/server.dart'; import 'package:toolbox/locator.dart'; import 'package:toolbox/view/page/private_key/edit.dart'; +import 'package:toolbox/view/widget/input_decoration.dart'; class ServerEditPage extends StatefulWidget { const ServerEditPage({Key? key, this.spi}) : super(key: key); @@ -61,25 +62,25 @@ class _ServerEditPageState extends State with AfterLayoutMixin { TextField( controller: nameController, keyboardType: TextInputType.text, - decoration: _buildDecoration('Name', icon: Icons.info), + decoration: buildDecoration('Name', icon: Icons.info), ), TextField( controller: ipController, keyboardType: TextInputType.text, autocorrect: false, - decoration: _buildDecoration('Host', icon: Icons.storage), + decoration: buildDecoration('Host', icon: Icons.storage), ), TextField( controller: portController, keyboardType: TextInputType.number, decoration: - _buildDecoration('Port', icon: Icons.format_list_numbered), + buildDecoration('Port', icon: Icons.format_list_numbered), ), TextField( controller: usernameController, keyboardType: TextInputType.text, autocorrect: false, - decoration: _buildDecoration('User', icon: Icons.account_box), + decoration: buildDecoration('User', icon: Icons.account_box), ), const SizedBox(height: 7), Row( @@ -95,7 +96,7 @@ class _ServerEditPageState extends State with AfterLayoutMixin { controller: passwordController, obscureText: true, keyboardType: TextInputType.text, - decoration: _buildDecoration('Pwd', icon: Icons.password), + decoration: buildDecoration('Pwd', icon: Icons.password), onSubmitted: (_) => {}, ) : const SizedBox(), diff --git a/lib/view/widget/input_decoration.dart b/lib/view/widget/input_decoration.dart new file mode 100644 index 00000000..2f739e10 --- /dev/null +++ b/lib/view/widget/input_decoration.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:toolbox/data/res/color.dart'; + +InputDecoration buildDecoration(String label, + {TextStyle? textStyle, IconData? icon}) { + return InputDecoration( + labelText: label, + labelStyle: textStyle, + icon: Icon( + icon, + color: primaryColor, + )); +}