Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #63 #64

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
# CHANGE LOG

## 2.0.0

**BREAKING CHANGES**

* Migration to null-safety ([#62](https://github.com/Norbert515/dynamic_theme/issues/62), [#60](https://github.com/Norbert515/dynamic_theme/issues/60), [#59](https://github.com/Norbert515/dynamic_theme/issues/59))
* Now use the `ThemeMode` instead of `Brightness` ([#49](https://github.com/Norbert515/dynamic_theme/issues/49)).
* `ThemedWidgetBuilder themedWidgetBuilder` takes now the following parameters: `BuildContext, ThemeMode, ThemeData`.
* `data` parameter is now optional and has the type `ThemeDataWithThemeModeBuilder`.
* `defaultBrightness` became `defaultThemeMode` and use by default `ThemeMode.system`.
* `loadBrightnessOnStart` became `loadThemeOnStart`.
* import `package:dynamic_theme/dynamic_theme.dart` for both `DynamicTheme` and `BrightnessSwitcherDialog`.

## 1.0.1

- Update local_storage dependency to latest 0.5.0
- Added and fixed linter rules
- Fixed default Dark mode problem from PRs
* Update local_storage dependency to latest 0.5.0
* Added and fixed linter rules
* Fixed default Dark mode problem from PRs
79 changes: 51 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,94 @@
# dynamic_theme

## Dynamically changing your theme without hassle

![](https://github.com/Norbert515/dynamic_theme/blob/master/assets/theme.png)

This packages manages changing your theme during runtime and persiting that theme.

### I wrote a medium post about this, check it out [here](https://proandroiddev.com/how-to-dynamically-change-the-theme-in-flutter-698bd022d0f0)!

## Include in your project

```
dependencies:
dynamic_theme: ^1.0.1
dynamic_theme: ^2.0.0
```

run packages get and import it

```
import 'package:dynamic_theme/dynamic_theme.dart';
```
if you want the dialog:
```
import 'package:dynamic_theme/theme_switcher_widgets.dart';
```

## Usage
Wrap your material app like this:

### Light & Dark mode

If all you want is to change the theme between light and dark you can just use the `themeMode` parameter and set the light theme with the `theme` property and dark theme with the `darkTheme` property.

```dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DynamicTheme(
themedWidgetBuilder: (_, themeMode, __) {
return MaterialApp(
title: 'Flutter Demo',
themeMode: themeMode,
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
);
}
}
```

### Custom theme

If you want to apply some custom `ThemeData` you can use the `data` parameter to provide a custom `ThemeData` and rely on the `themeData` from the `themedWidgetBuilder` .

```dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new DynamicTheme(
defaultBrightness: Brightness.light,
data: (brightness) => new ThemeData(
return DynamicTheme(
data: (themeMode) => ThemeData(
primarySwatch: Colors.indigo,
brightness: brightness,
brightness: themeMode == ThemeMode.dark ? Brightness.dark : Brightness.light,
),
themedWidgetBuilder: (context, theme) {
return new MaterialApp(
themedWidgetBuilder: (_, __, themeData) {
return MaterialApp(
title: 'Flutter Demo',
theme: theme,
home: new MyHomePage(title: 'Flutter Demo Home Page'),
theme: themeData,
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
);
}
}

```

Change the theme like this:

```dart
void changeBrightness() {
DynamicTheme.of(context).setBrightness(Theme.of(context).brightness == Brightness.dark? Brightness.light: Brightness.dark);
}
void changeThemeMode() {
DynamicTheme.of(context).setThemeMode(Theme.of(context).brightness == Brightness.dark ? ThemeMode.light : ThemeMode.dark);
}

void changeColor() {
DynamicTheme.of(context).setThemeData(new ThemeData(
primaryColor: Theme.of(context).primaryColor == Colors.indigo? Colors.red: Colors.indigo
));
}

void changeColor() {
DynamicTheme.of(context).setThemeData(ThemeData(
primaryColor: Theme.of(context).primaryColor == Colors.indigo ? Colors.red : Colors.indigo
));
}
```

When changing the brightness with `setBrightness`, it is additionally stored in the shared preferences.
When changing the theme mode with `setThemeMode` , it is additionally stored in the shared preferences.

## Also included

### A dialog widget to change the brightness!
### A dialog widget to change the theme mode !

![](https://github.com/Norbert515/dynamic_theme/blob/master/assets/dialogs.png)

## Getting Started
Expand Down
177 changes: 17 additions & 160 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,170 +1,27 @@
# Specify analysis options.
#
# Until there are meta linter rules, each desired lint must be explicitly enabled.
# See: https://github.com/dart-lang/linter/issues/288
#
# For a list of lints, see: http://dart-lang.github.io/linter/lints/
# See the configuration guide for more
# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
#
# There are other similar analysis options files in the flutter repos,
# which should be kept in sync with this file:
#
# - analysis_options.yaml (this file)
# - packages/flutter/lib/analysis_options_user.yaml
# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml
# - https://github.com/flutter/engine/blob/master/analysis_options.yaml
#
# This file contains the analysis options used by Flutter tools, such as IntelliJ,
# Android Studio, and the `flutter analyze` command.
include: package:flutter_lints/flutter.yaml

analyzer:
exclude:
- lib/**.g.dart
- test/**.mocks.dart
- lib/generated_plugin_registrant.dart
strong-mode:
implicit-dynamic: false
implicit-casts: false
errors:
# treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# treat missing returns as a warning (not a hint)
missing_return: warning
# allow having TODOs in the code
todo: ignore
exclude:
- 'bin/cache/**'
# the following two are relative to the stocks example and the flutter package respectively
# see https://github.com/dart-lang/sdk/issues/28463
- 'lib/i18n/stock_messages_*.dart'
- 'lib/src/http/**'
# todo: ignore

linter:
rules:
# these rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
- always_declare_return_types
- always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
- always_require_non_null_named_parameters
- always_specify_types
- annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
- avoid_as
# - avoid_bool_literals_in_conditional_expressions # not yet tested
# - avoid_catches_without_on_clauses # we do this commonly
# - avoid_catching_errors # we do this commonly
- avoid_classes_with_only_static_members
# - avoid_double_and_int_checks # only useful when targeting JS runtime
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
# - avoid_implementing_value_types # not yet tested
- avoid_init_to_null
# - avoid_js_rounded_ints # only useful when targeting JS runtime
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters # not yet tested
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
# - avoid_returning_null # there are plenty of valid reasons to return null
- avoid_returning_null_for_void
# - avoid_returning_this # there are plenty of valid reasons to return this
# - avoid_setters_without_getters # not yet tested
# - avoid_single_cascade_in_expression_statements # not yet tested
- avoid_slow_async_io
- avoid_types_as_parameter_names
# - avoid_types_on_closure_parameters # conflicts with always_specify_types
- avoid_unused_constructor_parameters
- avoid_void_async
- await_only_futures
- camel_case_types
- cancel_subscriptions
# - cascade_invocations # not yet tested
# - close_sinks # not reliable enough
# - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
# - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
# - curly_braces_in_flow_control_structures # not yet tested
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
# - file_names # not yet tested
- flutter_style_todos
- hash_and_equals
- implementation_imports
# - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
- iterable_contains_unrelated_type
# - join_return_with_assignment # not yet tested
- library_names
- library_prefixes
# - lines_longer_than_80_chars # not yet tested
- list_remove_unrelated_type
# - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
- no_adjacent_strings_in_list
- no_duplicate_case_values
- non_constant_identifier_names
# - null_closures # not yet tested
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
# - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods # not yet tested
- prefer_contains
- prefer_equal_for_default_values
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_locals
- prefer_foreach
# - prefer_function_declarations_over_variables # not yet tested
- prefer_generic_function_type_aliases
- prefer_initializing_formals
# - prefer_int_literals # not yet tested
# - prefer_interpolation_to_compose_strings # not yet tested
- prefer_is_empty
- prefer_is_not_empty
- prefer_iterable_whereType
# - prefer_mixin # https://github.com/dart-lang/language/issues/32
- prefer_single_quotes
- prefer_typing_uninitialized_variables
- prefer_void_to_null
# - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- recursive_getters
- slash_for_doc_comments
- sort_constructors_first
- sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
# - unawaited_futures # too many false positives
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_getters_setters
# - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
- use_rethrow_when_possible
# - use_setters_to_change_properties # not yet tested
# - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- valid_regexps
# - void_checks # not yet tested
- avoid_bool_literals_in_conditional_expressions
- avoid_escaping_inner_quotes
- avoid_positional_boolean_parameters
- parameter_assignments
- prefer_null_aware_method_calls
- require_trailing_commas
- use_is_even_rather_than_modulo
- use_named_constants
- use_to_and_as_if_applicable
- prefer_relative_imports
8 changes: 5 additions & 3 deletions example/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ lib/generated_plugin_registrant.dart

# Symbolication related
app.*.symbols
.flutter-plugins
.flutter-plugins-dependencies
ios/Flutter/flutter_export_environment.sh

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
6 changes: 4 additions & 2 deletions example/.metadata
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@
# This file should be version controlled and should not be manually edited.

version:
revision: 44b7e7d3f42f050a79712daab253af06e9daf530
channel: beta
revision: cf4400006550b70f28e4b4af815151d1e74846c6
channel: stable

project_type: app
14 changes: 11 additions & 3 deletions example/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
# example

A new Flutter example.
A new Flutter project.

## Getting Started

For help getting started with Flutter, view our online
[documentation](https://flutter.io/).
This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)

For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
Loading