mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Add dark theme
This commit is contained in:
		@@ -9,9 +9,12 @@ import 'package:shared_preferences/shared_preferences.dart';
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
enum PreferencesKeyList { LOGIN_TOKENS }
 | 
			
		||||
enum PreferencesKeyList { LOGIN_TOKENS, ENABLE_DARK_THEME }
 | 
			
		||||
 | 
			
		||||
const _PreferenceKeysName = {PreferencesKeyList.LOGIN_TOKENS: "login_tokens"};
 | 
			
		||||
const _PreferenceKeysName = {
 | 
			
		||||
  PreferencesKeyList.LOGIN_TOKENS: "login_tokens",
 | 
			
		||||
  PreferencesKeyList.ENABLE_DARK_THEME: "dark_theme",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PreferencesHelper {
 | 
			
		||||
  static PreferencesHelper _instance;
 | 
			
		||||
@@ -51,11 +54,20 @@ class PreferencesHelper {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future<void> setString(PreferencesKeyList key, String value) async {
 | 
			
		||||
    await _sharedPreferences.setString(_PreferenceKeysName[key], value);
 | 
			
		||||
  Future<bool> setString(PreferencesKeyList key, String value) async {
 | 
			
		||||
    return await _sharedPreferences.setString(_PreferenceKeysName[key], value);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  String getString(PreferencesKeyList key) {
 | 
			
		||||
    return _sharedPreferences.getString(_PreferenceKeysName[key]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future<bool> setBool(PreferencesKeyList key, bool value) async {
 | 
			
		||||
    return await _sharedPreferences.setBool(_PreferenceKeysName[key], value);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool getBool(PreferencesKeyList key, {bool alternative = false}) {
 | 
			
		||||
    final v = _sharedPreferences.getBool(_PreferenceKeysName[key]);
 | 
			
		||||
    return v == null ? alternative : v;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import 'package:comunic/helpers/account_helper.dart';
 | 
			
		||||
import 'package:comunic/helpers/database/database_helper.dart';
 | 
			
		||||
import 'package:comunic/helpers/preferences_helper.dart';
 | 
			
		||||
import 'package:comunic/ui/routes/home_route.dart';
 | 
			
		||||
import 'package:comunic/ui/routes/login_route.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
@@ -9,19 +10,29 @@ import 'package:flutter/material.dart';
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
void subMain() {
 | 
			
		||||
void subMain() async {
 | 
			
		||||
  // Connect to database
 | 
			
		||||
  DatabaseHelper.open();
 | 
			
		||||
  await DatabaseHelper.open();
 | 
			
		||||
 | 
			
		||||
  runApp(ComunicApplication());
 | 
			
		||||
  runApp(ComunicApplication(
 | 
			
		||||
    darkMode: (await PreferencesHelper.getInstance())
 | 
			
		||||
        .getBool(PreferencesKeyList.ENABLE_DARK_THEME),
 | 
			
		||||
  ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ComunicApplication extends StatelessWidget {
 | 
			
		||||
  final bool darkMode;
 | 
			
		||||
 | 
			
		||||
  const ComunicApplication({Key key, @required this.darkMode})
 | 
			
		||||
      : assert(darkMode != null),
 | 
			
		||||
        super(key: key);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return MaterialApp(
 | 
			
		||||
      debugShowCheckedModeBanner: false,
 | 
			
		||||
      home: ComunicApplicationHome(),
 | 
			
		||||
      theme: darkMode ? ThemeData.dark() : null,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import 'package:comunic/helpers/preferences_helper.dart';
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
@@ -23,9 +24,81 @@ class _AppSettingsBody extends StatefulWidget {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class __AppSettingsBodyState extends State<_AppSettingsBody> {
 | 
			
		||||
  PreferencesHelper _preferencesHelper;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
    super.initState();
 | 
			
		||||
    _load();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _load() async {
 | 
			
		||||
    final prefs = await PreferencesHelper.getInstance();
 | 
			
		||||
    setState(() {
 | 
			
		||||
      _preferencesHelper = prefs;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _needRefresh() {
 | 
			
		||||
    setState(() {});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return ListView(children: <Widget>[],);
 | 
			
		||||
    if (_preferencesHelper == null)
 | 
			
		||||
      return Center(child: CircularProgressIndicator());
 | 
			
		||||
 | 
			
		||||
    return Padding(
 | 
			
		||||
      padding: const EdgeInsets.all(8.0),
 | 
			
		||||
      child: ListView(
 | 
			
		||||
        children: <Widget>[
 | 
			
		||||
          // Dark theme
 | 
			
		||||
          _CheckBoxPreference(
 | 
			
		||||
            preferenceKey: PreferencesKeyList.ENABLE_DARK_THEME,
 | 
			
		||||
            preferencesHelper: _preferencesHelper,
 | 
			
		||||
            onUpdate: _needRefresh,
 | 
			
		||||
            title: tr("Enable dark theme"),
 | 
			
		||||
            description:
 | 
			
		||||
                tr("You will need to restart the application to apply changes"),
 | 
			
		||||
          ),
 | 
			
		||||
        ],
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _CheckBoxPreference extends StatelessWidget {
 | 
			
		||||
  final PreferencesKeyList preferenceKey;
 | 
			
		||||
  final PreferencesHelper preferencesHelper;
 | 
			
		||||
  final VoidCallback onUpdate;
 | 
			
		||||
  final String title;
 | 
			
		||||
  final String description;
 | 
			
		||||
 | 
			
		||||
  const _CheckBoxPreference({
 | 
			
		||||
    Key key,
 | 
			
		||||
    @required this.preferenceKey,
 | 
			
		||||
    @required this.preferencesHelper,
 | 
			
		||||
    @required this.onUpdate,
 | 
			
		||||
    @required this.title,
 | 
			
		||||
    @required this.description,
 | 
			
		||||
  })  : assert(preferencesHelper != null),
 | 
			
		||||
        assert(preferencesHelper != null),
 | 
			
		||||
        assert(onUpdate != null),
 | 
			
		||||
        assert(title != null),
 | 
			
		||||
        assert(description != null),
 | 
			
		||||
        super(key: key);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return SwitchListTile(
 | 
			
		||||
      value: preferencesHelper.getBool(preferenceKey),
 | 
			
		||||
      onChanged: (b) async {
 | 
			
		||||
        await preferencesHelper.setBool(preferenceKey, b);
 | 
			
		||||
        onUpdate();
 | 
			
		||||
        return true;
 | 
			
		||||
      },
 | 
			
		||||
      title: Text(title),
 | 
			
		||||
      subtitle: Text(description),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user