All notable changes to the FlexColorPicker package are documented in this file.
Mar 3, 2024
Requires min Flutter 3.16.0 and Dart 3.0.0.
NEW
- Added enum values
filled
andfilledTonal
toColorPickerActionButtonType
and added support for these button styles as OK/Cancel buttons in the ColorPicker dialog. - Added
dialogActionOnlyOkButton
toColorPickerActionButtons
. Defaults to false. If set to true anddialogActionButtons
is true, only the OK button will be shown. - Added support for a second custom color palette to the picker. In addition to
ColorPickerType.custom
there is now also aColorPickerType.customSecondary
picker selector. It gets its values fromColorPicker.customSecondaryColorSwatchesAndNames
. - Added support for transparent colors for both custom color palette pickers. They can now have opacity in the picker in their custom color values. This also works if the opacity and slider in
ColorPicker.enableOpacity
is not enabled. Nothing new is needed to use this feature. It works automatically when custom color palettes are used that have partially transparent colors in them. - Added
shadowColor
andsurfaceTintColor
to the dialog properties to enable control of the shadow color and surface tint color of the color picker dialog. - The color utilities
ColorTools.createPrimarySwatch
andColorTools.createAccentSwatch
now create color swatches with alpha channel value kept at its input values for all created swatch indexes. Previously they set alpha to#FF
, even if the value might have been something else. Creating palettes with very low alpha in the source color will not produce pretty palettes, but it is now possible to create them. - The Color picker received two new layout properties. Previously all vertical spacings between the column elements in the picker were controlled by the
ColorPicker
propertycolumnSpacing
. For two key elements, you can now override this spacing.- Use
toolbarSpacing
to adjust the vertical spacing below the top toolbar header and its action buttons. The purpose is to enable using zero space or close to it, so the top toolbar and action buttons can be closer to the picker selection control than the rest of the spacing in the picker uses. - Use
shadesSpacing
to adjust the vertical spacing after the Material-2 swatch palette. By setting it to zero or one, you can create a design where the Material-2 swatch-based palette is closer to or connected to the Material-3 tonal palette. As long as the tonal palette does not use a heading, of course. - Both
toolbarSpacing
andshadesSpacing
default tocolumnSpacing
if they are not defined. - More of these vertical spacing fine-tuning properties can be added if there is a need for them.
- Use
CHANGE
- Dialog OK and Cancel action buttons now use the
.icon
Material button variants, when icon usage is enabled. Previously they baked in the leading icon into the button child Widget. This version follows the Material design spec exactly. The visual change is minor, but it does look better now when icons are used. - Recent colors now also capture the opacity of a selected color as a different color, it does this also when you change opacity. Selecting a color with opacity in the recent colors list will set the picker's opacity to the opacity the color in the recent colors list has.
FIX
Package
- Replaced APIs deprecated in Flutter 3.19.0. Replaced internally used deprecated APIs
RawKeyboardListener
,RawKeyEvent
,RawKeyDownEvent
,RawKeyEventDataMacOs
,RawKeyEventDataIos
withShortcut
APIs. - When using custom transitions the
InheritedTheme.capture
should useactionButtons.useRootNavigator
value and not default it to true. Fixed.
Web demo
- Reset to defaults did not reset settings for
wheelSquarePadding
andwheelSquareBorderRadius
. Fixed.
January 21, 2024
- FIX: Fixed issue #71 _activeColorSwatchList init in Wheel with tonal palette case.
- CHORE: Bump FlexSeedScheme to version 1.4.0.
- TEST: Improved test coverage (65% -> 74%)
July 18, 2023
NEW
- Use
ColorPicker.tonalColorSameSize
set to true, to make the Material-3 HCT tonal palette color indicators use the same size as the size defined for the other color indicators. Previously and by default, the tonal color indicators are smaller to make the palette width match the width of the Material-2 swatch color palette, that has fewer colors.
FIX
-
Fixed issue #67 Inner circle does not move.
- When clicking on the color wheels square color box part inside the Hue circle, the click moved the selection on wheel when clicking close to the square edge. This is now fixed. The fix also introduces exact wheel tap/drag to start an operation of Hue wheel. Previously, the Hue wheel would start operating when taping or dragging on the square containing the Hue wheel, but outside the squared color area inside it. Now to start dragging or make a tap action, it must start on the Hue wheel. Dragging around outside it or inside it, once a drag operation has started, works as before.
-
Fixed issue #66 White color selects multiple colors.
- Part of original design with the picker was to only have a given color value appear in one color palette. When adding custom color palettes or using tonal palettes, the same color values may appear in multiple palettes. Selecting such a color value would highlight all the palettes the color appears in. Tonal palettes always contain white and black colors, so it is particularly problematic when using them. This fix prevents showing the main color as selected in multiple palettes and avoids switching Material swatch palette when operating on a tonal palettes. As a part of this FIX, main Material swatch shade color index 500 or Material accent swatch shade color index 200, is only shown as selected when its color is actually selected in a Material swatch or Material tonal color tone.
May 11, 2023
- Updated to use minimum
flex_seed_scheme ^1.3.0
. This version, no longer depends onmaterial_color_utilities
, thus avoiding all version issues and conflicts when Flutter changes what breaking version ofmaterial_color_utilities
it uses on different channels and versions. - Tested package with Flutter 3.10 and rebuilt web demo example with the new Flutter release.
Apr 16, 2023
- Changed to using
flex_seed_scheme: ^1.2.4
that depends onmaterial_color_utilities
with version constraint set to>=0.2.0 <0.4.0
from^0.2.0
.- This change enables the package to be used on current Flutter stable 3.7 versions, as well as the latest 3.10.x versions on channels beta and master. It will also work with the next stable Flutter release after 3.7.
- Updated default example to use Material 3.
Apr 2, 2023
NEW
- Based on user request, exposed widget
ColorCodeField
as a part of the package's public API. It can now be used externally as well. TheColorCodeField
is the color code entry and display field used by theColorPicker
.
Feb 1, 2023
CHANGE
- Requires minimum Flutter 3.7.0 and Dart 2.19.0 that Flutter 3.7.0 uses. Version 3.7.0 of Flutter broke the nullable
Overlay.of
API. The new API isOverlay.maybeOf
. This forced a new release of FlexColorPicker that requires minimum Flutter 3.7 that breaks compatibility with older versions of Flutter.
FIX
- Dart format and analyzer updates for Flutter 3.7.0.
- Add example screenshots to pubspec.yaml.
Jan 13, 2023
FIX
- Fixed the color picker item size Slider in the Web demo app. No changes to the package.
Jan 12, 2023
FIX
- The
onColorChanged
was called twice if just clicking on the wheel color picker's wheel or square to set a new color value via a single click. This fixes it, and such clicks now only generate oneonColorChanged
call-back. Dragging on the wheel and square still generateonColorChanged
call-backs during the entire drag process. To get callbacks just at start or end of drags, useonColorChangeStart
andonColorChangeEnd
as before.
Nov 23, 2022
BREAKING - STYLE
-
The color picker dialog
actionsPadding
now default to null. This results in that if it is undefined, its value is determined by the ambientAlertDialogTheme
, or if it is not defined either, the default forAlertDialog
. It has different defaults depending on if Material 2 or Material 3 is used. Default value in previous versions of FlexColorPicker was:EdgeInsets.symmetric(horizontal: 16)
-
The color picker dialog
buttonPadding
now default to null. This results in that if it is undefined, its value is determined by the ambientAlertDialogTheme
, or if it is not defined either, the default forAlertDialog
. It has different defaults depending on if Material 2 or Material 3 is used. Default value in previous versions of FlexColorPicker was:EdgeInsets.all(16)
-
The API usage of the above properties is unchanged. It is only the default behavior that has been updated to be less opinionated and to enable using theme-dependent settings.
BREAKING - REMOVED
- Removed in version 2.1.0 no longer used and already deprecated parameter
useRootNavigator
inColorPicker
methodshowPickerDialog
. - Removed in version 2.1.0 no longer used and already deprecated parameter
useRootNavigator
in functionshowColorPickerDialog
.
NEW
-
To
ColorPicker
methodshowPickerDialog
and to functionshowColorPickerDialog
, added parametersbarrierLabel
andanchorPoint
as pass along values to Flutter SDKshowDialog
andshowGeneralDialog
. -
To
ColorPicker
methodshowPickerDialog
and to functionshowColorPickerDialog
added parameterstransitionBuilder
andtransitionDuration
. IftransitionBuilder
is not null, theshowPickerDialog
andshowColorPickerDialog
will use theshowGeneralDialog
Flutter SDK function instead ofshowDialog
. TheshowGeneralDialog
function will be used with the providedtransitionBuilder
andtransitionDuration
. ThetransitionDuration
only has any impact when thetransitionBuilder
is used. IftransitionBuilder
is null, then theshowPickerDialog
andshowColorPickerDialog
use the Flutter SDKshowDialog
implementation as before, thus using the default Material platform dependentshowDialog
transition and duration.
EXAMPLES
- Default example: Added an example of how to use the
transitionBuilder
. - Web example: Modernized its theme by using Material 3 and a seed generated
ColorScheme
.
Sep 9, 2022
- Add
secondaryOffset
toOpacitySliderTrack
paint
method override to fix new requirement for master channel compatibility, works with the stable channel too. Thanks, Dan Reynolds for the PR.
Aug 30, 2022
- Contains all updates from 2.6.0-dev, dev2 and dev3.
- Updated minimum dependencies to Dart >=2.18.0 and Flutter >= 3.3.0.
August 28, 2022
CHANGE
-
This is a dev release that works with Flutter beta 3.3.0-0.5.pre and master channel. It has more relaxed constraints than 2.6.0-dev.2.
-
This version no longer depends directly on package
material_color_utilities
it usesflex_seed_scheme
instead, with a transitive dependency onmaterial_color_utilities
. -
Changed all used
TextTheme
style names to M3 versions, including docs.
August 21, 2022
CHANGE
-
This is a dev release for those that need to work with both stable and master channel, where Flutter master SDK depends on material_color_utilities 0.2.0 and 3.3.0 beta, pre for upcoming Flutter 3.3.0 stable, use material_color_utilities 0.1.5. It uses a controversial package constraint of:
material_color_utilities: '>=0.1.5 <=0.2.0'
. Using older versions 0.1.3 and 0.1.4 in theory also works, but they contain some breaking color values in the used algorithm for calculation of tonal palettes. The color changes are very minor and typically not visible to the eye. -
This dev release also disabled two trivial tests that contained incompatible results between Flutter 3.0.5 stable, 3.3.0-0.4.pre beta and 3.1.0-x master.
August 5, 2022
CHANGE
-
This is a dev release for those that need to work with the master channel, where Flutter SDK depends on material_color_utilities ^0.2.0.
-
Updated material_color_utilities to ^0.2.0. This version constraint does not work with Flutter 3.0.x stable or beta 3.3.x, and their earlier versions. This dev release is required to use Flutter SDK master
3.1.0-0.0.pre.2111
or later, that uses material_color_utilities 0.2.0. -
For other (older) versions of Flutter SDK, you can use package version 2.5.0 that has a material_color_utilities version constraint of ^0.1.3.
-
This release also updates Dart SDK constraint to
'>=2.17.0 <3.0.0'
and has Flutter listed as'>=3.1.0-0.0.pre.2111'
.
DOCS
- Harmonized the changelog style and its history. The new style and how it looks will be tested with a dev release to ensure it works well on pub.
April 21, 2022
NEW
- Added new features to add padding between the wheel-picker's shade square and hue wheel,
and to adjust the border radius on the shade square.
Addresses enhancement request #47 "Square padding".
The new features are available via
ColorPicker
propertieswheelSquarePadding
andwheelSquareBorderRadius
.
April 15, 2022
FIX
- Fixes issue #44 "High wheelWidth cause wrong cursor position in the ColorPicker"
NEW
-
The order of the action buttons Cancel - OK on the bottom of the built-in dialog can be changed to OK - Cancel. come in three flavors controlled by enum
ColorPickerActionButtonOrder
having values:okIsRight
this is the default, to no break past behavior.okIsLeft
adaptive
order depends on the used platform. Windows usesokIsLeft
othersokIsRight
.
The feature is enabled via the
ColorPickerActionButtons
configuration and its new propertydialogActionOrder
. -
By default, the color picker tries to set focus to its own internal widgets when it is created. It does this when either [ctrlC] or [ctrlV] are enabled in order for the keyboard listener to be able to react to copy-paste events even if no control on the widget has been focused yet. If you need another widget to retain focus, e.g., if the picker is used on a surface/scope shared with other widgets and not in its own dialog, then setting [autoFocus] to false might help.
If both [ctrlC] and [ctrlV] are false, the picker yields the focus the same way as setting [autoFocus] false, but then you have no keyboard-shortcut copy-paste functions at all. With [autoFocus] false, you can still use keyboard copy-paste shortcuts and yield the focus from the picker. When you do this, the copy-paste keyboard shortcuts will not work until one of the picker's components is focused by interacting with any of them.
The picker still grabs focus when you click on its background. This is used as a way to set focus to keyboard listener to enable copy-paste keyboard shortcuts or when you operate any of its controls, the control in question always gains focus.
You can now turn OFF the autofocus used by the keyboard listener by setting
autoFocus
to false inColorPickerCopyPasteBehavior
.This new feature can potentially also be used to address issue #33.
CHANGE
-
The generated Material Color swatch you get when you click on any color in the wheel picker has been updated and is a bit improved. It is still not the actual M2
MaterialColor
swatch algorithm, like the Tonal Palette is when it comes to Material 3. It uses the actual seed algorithm for the primary tonal palette you get with the selected color as input. The wheel detects when you select any Material 2 swatch color and shows its swatch then. For other colors, it computes aMaterialColor
swatch. This swatch is still not using the correct algorithm, but it is a bit better looking than before.There is currently no know Dart implementation of this algorithm, if there were it would be in use here. There are some versions in JS of the algorithm that have been reverse-engineered from the Material 2 design guide website. If someone wants to make a Dart version, that would be fabulous. Links and more information can be found in
ColorTools.createPrimarySwatch
EXAMPLES
The web demo app has been updated to demonstrate above new features.
March 3, 2022
FIX
- Fix for nullable/none-nullable difference for Flutter
IconButton
between Flutter version 2.10.0 and earlier versions Flutter 2.8.1, whereiconSize
is nullable in Flutter 2.10.x, but not in Flutter 2.8.1. See issues report #40 and PR #41.
February 18, 2022
NEW
-
Added capability to show a Material 3 tonal-palette as per Material 3 design specification.
-
To enable it set new
ColorPicker
propertyenableTonalPalette
to true. It is false by default. Like the Material Swatch shades heading that that has an optionalsubHeading
widget, when tonal palette is enabled you can show an optionaltonalSubheading
widget above it.-
When you click/select a color in the color picker, and tonal palette is enabled, a 13 shade Material 3 tonal-palette for the selected color will be generated. It always starts with black, tone 0 for the used seed color and ends in white, tone 100.
-
The official Material 3 Dart library is used to create the tonal palette from any selected color. The color you select functions a seed color to generate the tonal palette and might not be included itself and selected in the palette. You can click on any color in the generated palette to select and pick a color.
-
Selecting a color in the tonal palette, only selects the color in the palette. It does not update the palette. Only when you select a color from the other color sources in the picker, is that color used as key color, to seed and generate an updated color palette for the selected color.
-
CHANGE
-
The WEB example was updated to include enabling and disabling the tonal palette and built it with the Flutter version stable 2.10.1.
-
All dependencies in the Web demo were updated to their latest version.
The Web demo example requires at least Flutter 2.10.0 to be built. It uses ColorScheme properties in its theme that were not available earlier and removed in 2.10.0 deprecated color properties from its theme. The color picker package itself still has the same version requirement as before of Dart SDK:
'>=2.14.0 < 3.0.0'
.
November 17, 2021
- Fixed the style for color entry field, to always use the intended fixed stadium style.
- Updated dependencies for the web demo, big change was Riverpod to use v1.0.0.
- Lint rule updates.
- Bump Dart SDK requirement to 2.14.
- Build and publish the WEB demo with the updated version using Flutter 2.5.3.
July 16, 2021
CHANGE
- Improved performance by splitting wheel painting into
multiple painters and introducing
RepaintBoundary
widgets around expensive painters to avoid unnecessary repaints. Thank you, Krista Koivisto for this excellent contribution!
July 2, 2021
- Documentation fix.
July 2, 2021
-
Fix: The
useRootNavigator
argument is now respected on all Navigatorpop
functions used in theColorPicker
widget itself and by built-in dialogs used by theColorPicker
. To support this, the currentuseRootNavigator
property in theColorPicker.showPickerDialog()
and in the functionshowColorPickerDialog
had to be deprecated.The property has moved to become a configuration option in
ColorPickerActionButtons
class to make it accessible to the Navigator pop functions both in theColorPicker
widget itself, as well as to built-in dialogs.The default behavior has not changed, the setting still defaults to using dialogs that use the root navigator, but now the pop functions work as intended. If you for some reason have used none root navigators for the built-in dialogs in previous versions, you need to set
ColorPickerActionButtons(useRootNavigator: false)
and pass it toColorPicker(actionButtons)
orshowColorPickerDialog(actionButtons)
. -
Tests: Started adding more tests and coverage report. Total 5668 tests, coverage 65.36%.
-
Documentation and typo updates.
June 11, 2021
- Improvement: Performance slightly improved via an additional rebuild check.
- New feature: ColorTools got a new static function
swatchContainsColor
. - New feature: Set property
secondaryOnDesktopLongOnDeviceAndWeb
totrue
(defaults to false) in ColorPickerCopyPasteBehavior, to enable using long press in the color picker, to open up the COPY-PASTE context menu on Web, iOS and Android touch devices. While using secondary mouse button on desktop platforms Windows, Mac and Linux, but not if it is a desktop web app. - Documentation: Fixed broken API reference links in the API guide chapter. Mentioned that WEB build
requires a canvas kit build if
enableOpacity
feature is used. - Web example: The live web example got updated to use the latest Flutter stable embedder.
- CI/CD: Tried the CI/CD deployment with --base-href="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/flexcolorpicker/" instead of
repl
. Did not work, continuing withrepl
for now.
April 10, 2021
-
New feature: Enabled updating the color picker externally. Set the
color
property of the widget to a new value to update it. You can even "remote control" the color picker by updating thecolor
, if so needed.This is mostly a potential use-case for desktop and web, when the picker is not used in a dialog. You can use this on a phone or tablet too, but often there is not enough space to keep the picker visible on the main surface this way on mobile devices. However, on desktops it is certainly a valid use case that should be supported. It was previously not supported by design, but as we are going to support web/desktop use-cases, it should certainly be supported. This update adds support for it. The picker only updates if the externally provided
color
constructor property differs from its internally kept color state. Finding the right picker, computing its swatches, is a bit demanding, but it seems to work fluidly, even when remote-controlling the wheel and sliders interactively. -
Web example: Updated the Web example to also show the "remote control" of the on-screen color picker. A remote control widget with a few color boxes, that you can click on to update its colors externally was added. The demo even goes meta! You can use a modal dialog version of the ColorPicker, to control the ColorPicker on the screen in the card, from the dialog ColorPicker! Maybe not as such so useful, but an interesting demo.
April 9, 2021
- This release only contains documentation updates from pre-release 2.0.0-nullsafety.5
- Thi is the first stable release of the null-safe version
- This is a MAJOR new feature release, in addition to the null-safety conversion. Please see changelogs from 2.0.0-nullsafety.0 to nullsafety.5, for a complete list of changes and new features.
- To get familiar with version 2.0.0 and all its new features, it is recommended to go through the updated tutorial, and the API guide in the readme file.
- For convenience, the list of breaking changes from the previous stable version 1.1.5 is shown below.
BREAKING
In addition to breaking changes as a result of the null-safety implementation, this release contains a few other minor breaking changes from version 1.x, they mostly concern visual nuances and label defaults.
- The
colorCodeIcon
has been deprecated and no longer has any function. To modify the copy icon on the color code entry field, define theColorPickerCopyPasteBehavior(copyIcon: myIcon)
and provide it to thecopyPasteBehavior
property, it defaults to same icon as in versions 1.x. - The bottom dialog action button that selects the color now says OK instead of Select. The label for the OK button by default comes from a Material localization. You can as before change it to whatever string you want.
- The dialog bottom action button for OK by default now uses a plain
TextButton
and not anOutlinedButton
. This change is done to conform to a less opinionated default style. You can still manually configure it to use anOutlinedButton
instead as before. Now you can choose, before there was no choice. - The dialog bottom OK button is no longer autofocused.
- The extension
FlexPickerNoNullStringExtensions
on none nullableString
namedtoColor
, no longer returns color valueColor(0x00000000)
for colors that cannot be parsed to a Color. It now returnsColor(0xFF000000)
. This is because the Flutter SDK dislikes the fully transparent blackColor(0x00000000)
, if it is fully opaque black, it works better as a fallback safety color. TheFlexPickerNullableStringExtensions
onString?
namedtoColorMaybeNull
works as before by returning null when theString?
cannot be parsed to aColor
. - The color code edit and entry field now work more like a normal text entry field. It still only accepts valid hex input and converts all inputs to uppercase.
April 8, 2021
-
Fix: Setting
borderColor
did not change the border color on the wheel whenwheelHasBorder
was true. -
New features: The
showPickerDialog
method now exposes most (= not directly controlled) properties of the underlyingAlertDialog
used to make the dialog, this includes e.g., thebackgroundColor
,elevation
,clipBehavior
andshape
as new exposed properties that may be useful. -
New feature: Added a new alternative color picker dialog function
showColorPickerDialog
that returns aFuture<Color>
which when the dialog is closed, returns the selected color from the dialog or original start color value, if no selection was made. This picker might be simpler to use in some scenarios. However, it does not allow for the feature where colors and theme's can update in the background behind the dialog, as colors are selected in it, before it is even closed. However, if you just need to open a dialog, select a color and move on, this version offers a simpler API for that. Under the hood it is just a wrapper for the previous more capable version with the onChange callbacks. It shares all other properties and features with theColorPicker
, combined with itsshowPickerDialog
method, except all the onChanged callbacks that are excluded. Since the propertieselevation
andtitle
in theshowPickerDialog
method, would collide with the same named properties inColorPicker
. The dialog's elevation and title in theshowColorPickerDialog
are instead calleddialogElevation
anddialogTitle
in it. -
Improvement: Performance was improved via more optimized rebuilds.
-
Documentation: The first version of updated documentation with API guide documentation is now included. It still requires proofreading before stable release, but getting close to being ready for release now.
-
Default example: The default example got a new picker that shows how the new
showColorPickerDialog
functions. -
Web example: The Web example, with the built-in API tooltips guides, got a major rewrite. It was originally not intended to be as large as it grew to be, but since it grew so much it needed a rewrite.
- It now uses Riverpod to make its simple state management needs easy to handle and much cleaner than before. It also includes persisting the settings directly as settings are changed in the app. Persistence is implemented with Hive. It should work on all Flutter platforms as well, but it has only been tested on Android, Web and Windows.
- As an experiment, only RiverPod StateProviders were used. While the setup is a bit tedious, it enables the desired fine-grained control over rebuilds of all the used setting control widgets. Each setting is also stored as an individual key-value pair in the used Hive box. A ProviderObserver that observes changes in the StateProviders we want to persist is used to save any state change to the used Hive box, regardless of where the state is changed in the demo app.
- This setup was an experiment to see if it might work and provide some simplification benefits. At least in this case, it did. It is also a pretty interesting and simple solution. The default start values are also defined via the Riverpod StateProvider's default values, that also use their const Hive string key as their provider name. Each StateProvider gets its start setting value from the Hive box with the same key. If the key does not exist yet in Hive, it falls back to a default value from a const Map using the same string const as its key, for the default fallback value. Reset back to default values is also done by setting all providers' state back to their default values as defined by the same const fallback value map.
March 22, 2021
- New feature: A bool
enableOpacity
property was added that enables an opacity slider that can be used to control the alpha channel in the selected ARGB color value. The slider height can be controlled withopacityTrackHeight
, the width withopacityTrackWidth
and the slider thumb size withopacityThumbRadius
. There is also aopacitySubheading
Widget that can be used to provide a Widget heading for the opacity slider.
March 12, 2021
- Fix: Color code field no longer receives focus when switching to it on the wheel page. Focus is set to color wheel, or the selected color shade if shade colors are present. The focus handling has also been improved for desktop usage.
- Fix: The property
editUsesParsedPaste
now works as intended, if true, desktop keyboard paste commands, while editing a color value are intercepted, and the hole pasted buffer value gets parsed, it does not get pasted into the field. For normal field paste functionality keepeditUsesParsedPaste
false (default). - Minor breaking: The color code edit and entry field now work more like a normal text entry field. It still only accepts valid hex input and converts all inputs to uppercase.
- New property: If
colorCodeHasColor
is true, then the background of the color code entry field uses the current selected color. - New property If
colorCodeReadOnly
the color code entry field is always read-only. Normally, color code can be edited on the wheel picker, set this to true to make it read only there as well. Copy/paste operations still work if they are enabled even if the color code field entry is in read-only mode. - New feature: The
copyPasteBehavior
property received three new features and properties:- The copy/paste context menu can now also optionally use secondary, typically mouse right, click by setting
secondaryMenu
to true. - It also has a mode where long press will be used on iOS/Android, but secondary mouse click will be
used on desktop/web, by setting
secondaryOnDesktopLongOnDevice
to true. - When
parseShortHexCode
is true the hex color code paste action and field entry parser, interpret short three character web hex color codes like in CSS.
- The copy/paste context menu can now also optionally use secondary, typically mouse right, click by setting
- New extension: The extension
FlexPickerNoNullStringExtensions
onString
got a new extension functionColor toColorShort(bool enableShortRGB)
. - New extension: The extension
FlexPickerNullableStringExtensions
onString?
got a new extension functionColor? toColorShortMaybeNull(bool enableShortRGB)
. - Minor breaking: The extension
FlexPickerNoNullStringExtensions
on none nullableString
namedtoColor
, no longer returns color valueColor(0x00000000)
for colors that cannot be parsed to a Color. It now returnsColor(0xFF000000)
. This is because the Flutter SDK dislikes the fully transparent blackColor(0x00000000)
, if it is fully opaque black, it works better as a fallback safety color. TheFlexPickerNullableStringExtensions
onString?
namedtoColorMaybeNull
works as before by returning null when theString?
cannot be parsed to aColor
. - Tests: Added unit tests for
ColorPickerActionButtonType
andColorPickerCopyPasteBehavior
.
See API documentation for more information.
March 3, 2021
- Documentation and live Web demo link fixes.
March 3, 2021
There are many new features included in this version 2 pre-release. The new features can be explored with the live Web example. Its source code is also included in the package example folder, in "example/lib/demo/main.dart".
-
Improvement: The wheel picker now moves on pointer-down to point location, it no longer requires a slight movement for its thumbs to move to the selected start tracking point.
-
Improvements: Keyboard traversal of the colors and selecting indicator colors with the keyboard using enter or space key. The wheel can however still not be operated with a keyboard, only touch and mouse controlled.
-
New property:
onColorChangeStart
called when user starts color selection with current color before the change. -
New property:
onColorChangeEnd
called when user ends color selection with the new color value. -
New property:
selectedPickerTypeColor
the color of the thumb on the slider that shows the selected picker. Ported from none null-safe version 1.1.4, does not exist in version 2.0.0-nullsafety.0. -
New property:
colorCodePrefixStyle
defines the text style of the prefix for the color code. If not defined it defaults to same style ascolorCodeTextStyle
. Ported from none null-safe version 1.1.4, does not exist in version 2.0.0-nullsafety.0. -
New property:
title
is a Widget used as an app bar type of title widget above the heading. Can also include copy, paste, select-close and cancel-cancel icon buttons when the picker is used as a dialog. -
New feature: There is an
actionButtons
property that takes anColorPickerActionButtons()
. It is used to define what type of Ok and Cancel action buttons the color picker has when used in a dialog. It is possible to define if bottom action buttons should beTextButton
,OutlinedButton
orElevatedButton
per button. If not defined, the labels on the buttons come from Material localizations, not from hard-coded default values. See breaking label for the 'Select' label. There are optional select/OK and cancel icon buttons that can be used in the title bar for a more compact dialog. -
New feature: There is a
copyPasteBehavior
property that takes anColorPickerCopyPasteBehavior()
. It is used to define the copy/paste behavior of the color picker, including:- Keyboard shortcuts: CTRL-C, CMD-C, CTRL-V, CMD-V
- Top toolbar copy-paste buttons.
- Long press copy-paste menu.
All copy/paste behaviors are optional and can be enabled based on what is needed.
For the copy format, the desired resulting RGB color string format can be configured to use #RRGGBB RRGGBB #AARRGGBB AARRGGBB and 0xAARRGGBB (default) options. The selected copy format is indicated with the corresponding prefix in the color code display/edit field when it is enabled.
Paste supports parsing multiple RGB color string formats. It automatically detects what format is used and auto parses to correct Flutter/Dart color value. You can, for example, paste string formatted as #RRGGBB RRGGBB #AARRGGBB AARRGGBB #RGB RGB or 0xAARRGGBB, partial color string values also work. You can also activate a snack bar that informs the users if they paste color strings in an unsupported RGB string format into the color picker.
See API documentation for more information.
-
New feature: The picker can display recently used colors in a list of color indicators at the bottom of the picker. You can use the following properties to control it.
showRecentColors
set to true/false to enable/disable the usage of the recent colors feature.recentColorsSubheading
subheading widget for the recently used colors. Typically, a Text widget, e.g.,Text('Recent colors')
. If not provided, there is no sub heading for the recently used colors.maxRecentColors
number of recent colors to track, from 2 to 20 allowed.recentColors
a list with current recent color, defaults to empty. You can store the last list and use this list to restore the previous recent colors list.onRecentColorsChanged
optional value callback that returns a copy the current list of recently used colors. Use it to store a copy of the recent colors to be able to restore it later.
See API documentation for more information.
BREAKING
The following are minor breaking changes from version 1.1.5, they mostly concern visual nuances and label defaults.
- The
colorCodeIcon
has been deprecated and no longer has any function. To modify the copy icon on the color code entry field, define theColorPickerCopyPasteBehavior(copyIcon: myIcon)
and provide it to thecopyPasteBehavior
property, it defaults to same icon as in version 1.1.5. - The bottom dialog action button that selects the color now says OK instead of Select. The label for the OK button by default comes from a Material localization. You can as before change it to whatever string you want.
- The dialog bottom action button for OK by default now uses just a plain
TextButton
and not anOutlinedButton
, this change is done to conform to a less opinionated default style. You can still manually configure it to use anOutlinedButton
instead as before. Now you can choose, before there was no choice. - The dialog bottom OK button is no longer autofocused.
February 15, 2021
- First version with null safety.
- A workaround to issue #71687 was introduced. The issue has not been solved. However, the workaround allows for the Wrap implementation, that was changed to a Row in version 1.1.2, to be used again.
- The almost full API-configurable Web demo is included in the package in "example/lib/demo/main.dart" together with the previous default example in
example/lib/main.dart
. Previously, this Web example was in a separate GitHub repository. The example was updated to make it responsive, to offer better usability on Web builds.
March 3, 2021
- Fix: When
selectedPickerTypeColor
color was undefined, the thumb did not receive the same text color as the default and only one before in version 1.1.3 and earlier, in dark-mode. This broke compatibility with past style when using dark-mode. This fix restores the correct past style when theselectedPickerTypeColor
is undefined.
March 3, 2021
- Feature: New property
selectedPickerTypeColor
: Defines the color of the thumb on the slider that shows the selected picker. - Feature: New property
colorCodePrefixStyle
: Defines the text style of the prefix for the color code. If not defined it defaults to same style ascolorCodeTextStyle
.
December 22, 2020
- Fix: Faulty documentation and comment for showPickerDialog parameter insetPadding.
- Fix: Faulty default value for showPickerDialog parameter insetPadding, the new default
value is the same as Flutter and Material default
EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0)
, as it should have been. - Documentation: Minor documentation style correction.
December 5, 2020
- Temporary: The Wrap implementation for showing the color code and integer value was changed to a Row due to a regression in Flutter SDK causing a crash issue on channels dev and master when showing the ColorPicker in a Dialog. For more info see here: flutter/flutter#71687
- When the issue is resolved, the implementation will be reverted to Wrap again. Using a Wrap has the benefit of breaking the color code display+input field and the rarely used int value, into two rows in case a large font is used in a narrow view. The Row may overflow in some rare cases. If you do not plan to use the ColorPicker with channels and versions affected by the issue, you can still use the previous version 1.1.1 to keep using the Wrap implementation if you need it. With normal styling, it is typically not needed.
- Fixed that the provided
TextStyle
via propertycolorCodeTextStyle
was not also applied to the shown color integer value whenshowColorValue
was set totrue
, as stated in API doc and intended.
November 11, 2020
- Updated the example app and documentation. The update includes updated screenshots and updated animated gifs.
- Unit tests for ColorTools added. Widget tests are still pending for later updates.
November 6, 2020
- New API: Added
showColorValue
to optionally display the int value of the selected color. This can be used to assist developers when they need to see or copy selected color values as int numbers. - New APIs: Exposed previously missing static color names in the API for all the accent and B&W color names in
ColorTools
. All the color name values default to English color names, but can now be changed to translated strings to provide Material color names in other languages as well. - Updated the live Web demo to demonstrate the
showColorValue
property. - Example and documentation updated.
November 5, 2020
- First official release.
- Example and documentation updated.
- Updated the live Web demo version to use the released package.
- New API: Added
shouldUpdate
to the color-wheel picker, as a fix for an issue where black selection changed hue to red. This is a lower level API. It is not needed unless you make your own picker from scratch, and you want to use the wheel picker in your own picker. - Final API name tweaks before version 1.0.0 release:
- Renamed: API
createPrimaryColor
->createPrimarySwatch
- Renamed: API
createAccentColor
->createAccentSwatch
- Renamed: API
colorNameAndHexCode
->materialNameAndCode
- Renamed: API
colorName
->materialName
- Renamed: API
colorHexCode
->colorCode
November 5, 2020
- Added a feature on the wheel color picker that enables entry of a hex RGB value to select a color.
- API changes to support separate display of Material color name
showMaterialName
and selected color codeshowColorCode
, plus defining their text stylesmaterialNameTextStyle
andcolorCodeTextStyle
. - New API
showColorName
to display an English color name for any selected color, not just the Material color names or custom named color swatches. It has text style that can be defined as wellcolorNameTextStyle
. - New API
colorCodeIcon
that exposes the color code copy icon, so it can be customized. - New API
enableTooltips
to enable current and future tooltips used in the picker. Currently, only the copy color code button has a tooltip. - A new method introduced in ColorTools called
nameThatColor(Color color)
. It returns a name for any color passed to it. Only supports English names. Based on a Dart port of https://chir.ag/projects/ntc, it contains 1566 colors and their names. It matches the given color to the closest similar color in the list and returns its name. - Example and documentation updated.
November 2, 2020
- Update to try to get the images to show up on pub.dev.
- Minor documentation corrections.
November 2, 2020
- Significant API name changes and cleanup. Decided to implement previously planned changes before the official release.
October 30, 2020
- First development pre-release on pub.dev.
These are the topics I currently have on the TODO list for this package. Do you have a new suggestion and idea? Feel free to open a suggestion or issue in the repo.
- Additional controls for selecting active picker, maybe a custom slider, ToggleButtons and probably also a compact dropdown.
- Add one more color picker type advanced, using sliders as controls for the other formats.
- Add support for other color formats than RGB, HSL, HSV, CMYK, M3-HCT.
- Add support for a pipette tool to pick colors from the screen.
- Add possibility to in picker add selected colors to a custom picker.
- Reactor the code to prepare for making a major new version 4.0.0.
- Add more tests. Done. Now at 84%, pretty OK now, but even more tests are always welcome.
- Release the stable version 2.0.0
- Add GitHub actions for test, analyze, coverage, build and web demo deployment.
- Add a simpler optional async dialog picker function that returns selected color.
- Add support for colors with opacity or alpha.
- Improve copy/paste feature.
- Version 2.0.0-nullsafety.0: Add null safe version.
- Version 1.1.1: Add first tests of the ColorPicker, so far only unit tests for ColorTools, more tests will be added later. ColorTools has 4694 tests.
- Publish version 1.0.0 on pub.dev.
- Release version 1.0.0.
- Add "name that color" function that can give a name to "any" color in English.
- For the color-wheel picker, add text input to get a given color based on entered HEX code.
- Fix doc images that show up OK in GitHub readme.md, but not on pub.dev.
- Review and correct documentation mistakes and typos, first pass anyway.
- Review and update the API.