From 47ffb2498e3c1ce0af351248421cca1f4404a434 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Thu, 24 Sep 2026 13:10:03 +0200 Subject: [PATCH 1/5] Fix ScatterChart failing to render spots with error ranges `ScatterChartSpot.x_error` and `y_error` were typed `Any` and handed to fl_chart's `ScatterSpot` unparsed. `Control.get` infers `FlErrorRange?` from the parameter and returns the wire value as is, so any value other than `None` failed the cast in `build()` with `type '_Map' is not a subtype of type 'FlErrorRange?'`. Flutter then replaced the whole chart with its error widget, a grey box in release builds, and the message only reached Python as `page.on_error`. Add a `ChartErrorRange` value type with the `lower_by` and `upper_by` bounds of `FlErrorRange`, parse it with `parseFlErrorRange()`, and reject negative bounds in Python since `FlErrorRange` asserts they are non-negative. fl_chart draws error bars for any spot with an error range, but its default painter draws them in white, which is invisible on light backgrounds. Draw each spot's bars in the color of that spot, which is also the default in matplotlib and Plotly. --- CHANGELOG.md | 6 ++ sdk/python/packages/flet-charts/CHANGELOG.md | 6 ++ .../flet-charts/src/flet_charts/__init__.py | 2 + .../src/flet_charts/scatter_chart_spot.py | 26 +++++--- .../flet-charts/src/flet_charts/types.py | 61 +++++++++++++++++++ .../flet_charts/lib/src/scatter_chart.dart | 7 ++- .../flet_charts/lib/src/utils/charts.dart | 9 +++ .../lib/src/utils/scatter_chart.dart | 8 +++ .../controls/charts/types/charterrorrange.md | 7 +++ website/sidebars.yml | 1 + 10 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 website/docs/controls/charts/types/charterrorrange.md diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ee25dc62..2f2c56c304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.0.2 + +### Bug fixes + +* flet-charts: Fix `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot by @ndonkoHenri. + ## 1.0.1 ### Improvements diff --git a/sdk/python/packages/flet-charts/CHANGELOG.md b/sdk/python/packages/flet-charts/CHANGELOG.md index 70f2d91b51..b1968ed56d 100644 --- a/sdk/python/packages/flet-charts/CHANGELOG.md +++ b/sdk/python/packages/flet-charts/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 1.0.2 + +### Fixed + +- Fixed `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot by @ndonkoHenri. + ## 1.0.0 ### Fixed diff --git a/sdk/python/packages/flet-charts/src/flet_charts/__init__.py b/sdk/python/packages/flet-charts/src/flet_charts/__init__.py index 53f33967c6..2910381231 100644 --- a/sdk/python/packages/flet-charts/src/flet_charts/__init__.py +++ b/sdk/python/packages/flet-charts/src/flet_charts/__init__.py @@ -58,6 +58,7 @@ ChartCirclePoint, ChartCrossPoint, ChartDataPointTooltip, + ChartErrorRange, ChartEventType, ChartGridLines, ChartPointLine, @@ -85,6 +86,7 @@ "ChartCirclePoint", "ChartCrossPoint", "ChartDataPointTooltip", + "ChartErrorRange", "ChartEventType", "ChartGridLines", "ChartPointLine", diff --git a/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py b/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py index 7e2d0fbeb0..dbf2d6d725 100644 --- a/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py +++ b/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py @@ -1,8 +1,8 @@ from dataclasses import field -from typing import Any, Optional, Union +from typing import Optional, Union import flet as ft -from flet_charts.types import ChartDataPointTooltip, ChartPointShape +from flet_charts.types import ChartDataPointTooltip, ChartErrorRange, ChartPointShape __all__ = ["ScatterChartSpot", "ScatterChartSpotTooltip"] @@ -86,18 +86,24 @@ class ScatterChartSpot(ft.BaseControl): Sort by this to manage overlap. """ - x_error: Optional[Any] = None + x_error: Optional[ChartErrorRange] = None """ - Determines the error range of the data point using - [FlErrorRange](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#flerrorrange) - (which contains lowerBy and upperValue) for the `X` axis. + The error range of this spot on the `X` axis, drawn as a horizontal error bar + in the color of this spot. + + Automatic axis bounds cover spot positions only, so set + :attr:`~flet_charts.ScatterChart.min_x` and + :attr:`~flet_charts.ScatterChart.max_x` to keep the error bar inside the chart. """ - y_error: Optional[Any] = None + y_error: Optional[ChartErrorRange] = None """ - Determines the error range of the data point using - [FlErrorRange](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#flerrorrange) - (which contains lowerBy and upperValue) for the `Y` axis. + The error range of this spot on the `Y` axis, drawn as a vertical error bar + in the color of this spot. + + Automatic axis bounds cover spot positions only, so set + :attr:`~flet_charts.ScatterChart.min_y` and + :attr:`~flet_charts.ScatterChart.max_y` to keep the error bar inside the chart. """ selected: bool = False diff --git a/sdk/python/packages/flet-charts/src/flet_charts/types.py b/sdk/python/packages/flet-charts/src/flet_charts/types.py index 23a4d72c9c..9a995bf535 100644 --- a/sdk/python/packages/flet-charts/src/flet_charts/types.py +++ b/sdk/python/packages/flet-charts/src/flet_charts/types.py @@ -8,6 +8,7 @@ "ChartCirclePoint", "ChartCrossPoint", "ChartDataPointTooltip", + "ChartErrorRange", "ChartEventType", "ChartGridLines", "ChartPointLine", @@ -414,6 +415,66 @@ def copy( ) +@ft.value +class ChartErrorRange: + """ + The uncertainty of a data point's value on one axis, drawn as an error bar. + + Both bounds are measured from the value, so the range spans from + `value - lower_by` to `value + upper_by`. + """ + + lower_by: ft.Number + """ + How far the range extends below the value. + + Raises: + ValueError: If it is not greater than or equal to `0`. + """ + + upper_by: ft.Number + """ + How far the range extends above the value. + + Raises: + ValueError: If it is not greater than or equal to `0`. + """ + + def __post_init__(self): + if self.lower_by < 0: + raise ValueError( + f"lower_by must be greater than or equal to 0, got {self.lower_by}" + ) + if self.upper_by < 0: + raise ValueError( + f"upper_by must be greater than or equal to 0, got {self.upper_by}" + ) + + @classmethod + def symmetric(cls, value: ft.Number) -> "ChartErrorRange": + """ + Creates a range that extends equally below and above the value. + + Args: + value: The distance of both bounds from the value. + """ + return cls(lower_by=value, upper_by=value) + + def copy( + self, + *, + lower_by: Optional[ft.Number] = None, + upper_by: Optional[ft.Number] = None, + ) -> "ChartErrorRange": + """ + Returns a copy of this object with the specified properties overridden. + """ + return ChartErrorRange( + lower_by=lower_by if lower_by is not None else self.lower_by, + upper_by=upper_by if upper_by is not None else self.upper_by, + ) + + class HorizontalAlignment(Enum): """Defines an element's horizontal alignment to given point.""" diff --git a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/scatter_chart.dart b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/scatter_chart.dart index 5bcf298b23..78d1bd4cc7 100644 --- a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/scatter_chart.dart +++ b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/scatter_chart.dart @@ -44,8 +44,8 @@ class _ScatterChartControlState extends State { return ScatterSpot(x, y, show: spot.visible, renderPriority: spot.getInt('render_priority', 0)!, - xError: spot.get('x_error'), - yError: spot.get('y_error'), + xError: parseFlErrorRange(spot.get('x_error')), + yError: parseFlErrorRange(spot.get('y_error')), dotPainter: spot.get("point") != null ? parseChartDotPainter(spot.get("point"), theme, 0, null, null) : FlDotCirclePainter( @@ -122,7 +122,8 @@ class _ScatterChartControlState extends State { .toList(), rotationQuarterTurns: widget.control.getInt('rotation_quarter_turns', 0)!, - //errorIndicatorData: widget.control.get('error_indicator_data'), + errorIndicatorData: + const FlErrorIndicatorData(painter: getScatterSpotErrorPainter), ), duration: animation.duration, curve: animation.curve, diff --git a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart index 91213a6b09..43dce6c478 100644 --- a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart +++ b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart @@ -167,6 +167,15 @@ AxisTitles parseAxisTitles(Control? control) { )); } +/// Parses a `ChartErrorRange` into an [FlErrorRange]. +FlErrorRange? parseFlErrorRange(dynamic value, [FlErrorRange? defaultValue]) { + if (value == null) return defaultValue; + return FlErrorRange( + lowerBy: parseDouble(value["lower_by"], 0)!, + upperBy: parseDouble(value["upper_by"], 0)!, + ); +} + FLHorizontalAlignment? parseFLHorizontalAlignment(String? value, [FLHorizontalAlignment? defaultValue]) { if (value == null) return defaultValue; diff --git a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/scatter_chart.dart b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/scatter_chart.dart index 2536045d9f..aea13210d0 100644 --- a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/scatter_chart.dart +++ b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/scatter_chart.dart @@ -24,6 +24,14 @@ class ScatterChartEventData extends Equatable { List get props => [eventType, spotIndex]; } +/// Draws the error bars of a spot in the color of that spot. +/// +/// The default painter of fl_chart draws them in white, which is invisible on +/// light backgrounds. +FlSpotErrorRangePainter getScatterSpotErrorPainter( + ScatterChartSpotErrorRangeCallbackInput input) => + FlSimpleErrorPainter(lineColor: input.spot.dotPainter.mainColor); + ScatterTouchTooltipData parseScatterTouchTooltipData( BuildContext context, Control control, List spots) { var tooltip = control.get("tooltip") ?? {}; diff --git a/website/docs/controls/charts/types/charterrorrange.md b/website/docs/controls/charts/types/charterrorrange.md new file mode 100644 index 0000000000..63cdafa565 --- /dev/null +++ b/website/docs/controls/charts/types/charterrorrange.md @@ -0,0 +1,7 @@ +--- +title: "ChartErrorRange" +--- + +import {ClassAll} from '@site/src/components/crocodocs'; + + diff --git a/website/sidebars.yml b/website/sidebars.yml index a941178302..9cbbee77ee 100644 --- a/website/sidebars.yml +++ b/website/sidebars.yml @@ -477,6 +477,7 @@ docs: - controls/charts/types/chartcirclepoint.md - controls/charts/types/chartcrosspoint.md - controls/charts/types/chartdatapointtooltip.md + - controls/charts/types/charterrorrange.md - controls/charts/types/charteventtype.md - controls/charts/types/chartgridlines.md - controls/charts/types/chartpointline.md From da93430d3b9881b3396ddf2db08272b84831812c Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Thu, 24 Sep 2026 16:18:15 +0200 Subject: [PATCH 2/5] Add a scatter chart example with error bars The example plots the mean period of a pendulum for each string length. Horizontal bars use `ChartErrorRange.symmetric()` for the length uncertainty, and vertical bars use an asymmetric `ChartErrorRange` that spans the fastest and slowest timing. Explicit axis bounds keep the bars inside the chart. The ScatterChart docs page shows its code. --- .../scatter_chart_with_error_bars/main.py | 87 +++++++++++++++++++ .../pyproject.toml | 26 ++++++ website/docs/controls/charts/scatterchart.md | 2 + 3 files changed, 115 insertions(+) create mode 100644 sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/main.py create mode 100644 sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/pyproject.toml diff --git a/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/main.py b/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/main.py new file mode 100644 index 0000000000..7c18f6f18a --- /dev/null +++ b/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/main.py @@ -0,0 +1,87 @@ +import statistics + +import flet as ft +import flet_charts as fch + +# Five timings of one swing (in seconds) for each pendulum string length (in cm). +TIMINGS = { + 20: [0.84, 0.95, 0.90, 0.88, 0.93], + 40: [1.22, 1.33, 1.27, 1.25, 1.30], + 60: [1.50, 1.62, 1.55, 1.52, 1.58], + 80: [1.73, 1.86, 1.80, 1.76, 1.82], + 100: [1.94, 2.09, 2.00, 1.98, 2.03], + 120: [2.13, 2.29, 2.19, 2.17, 2.24], +} + +# How far off each measured string length may be, in cm. +LENGTH_UNCERTAINTY = 3 + + +def main(page: ft.Page): + grid_color = ft.Colors.with_opacity(0.2, ft.Colors.ON_SURFACE) + + spots = [] + for length, timings in TIMINGS.items(): + mean = statistics.fmean(timings) + spots.append( + fch.ScatterChartSpot( + x=length, + y=mean, + radius=6, + color=ft.Colors.INDIGO, + tooltip=f"{mean:.2f} s", + x_error=fch.ChartErrorRange.symmetric(LENGTH_UNCERTAINTY), + y_error=fch.ChartErrorRange( + lower_by=mean - min(timings), + upper_by=max(timings) - mean, + ), + ) + ) + + page.add( + ft.SafeArea( + expand=True, + content=ft.Column( + expand=True, + controls=[ + ft.Text( + "Mean period of a pendulum over five timings. Vertical bars " + "span the fastest and slowest timing, horizontal bars the " + f"±{LENGTH_UNCERTAINTY} cm uncertainty of the string length." + ), + fch.ScatterChart( + expand=True, + min_x=0, + max_x=140, + min_y=0.5, + max_y=2.5, + border=ft.Border.all(1, grid_color), + horizontal_grid_lines=fch.ChartGridLines( + interval=0.5, color=grid_color, width=1 + ), + vertical_grid_lines=fch.ChartGridLines( + interval=20, color=grid_color, width=1 + ), + left_axis=fch.ChartAxis( + title=ft.Text("Period (s)"), + title_size=24, + label_spacing=0.5, + label_size=40, + ), + bottom_axis=fch.ChartAxis( + title=ft.Text("String length (cm)"), + title_size=24, + label_spacing=20, + label_size=28, + show_max=False, + ), + spots=spots, + ), + ], + ), + ) + ) + + +if __name__ == "__main__": + ft.run(main) diff --git a/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/pyproject.toml b/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/pyproject.toml new file mode 100644 index 0000000000..ed59971b55 --- /dev/null +++ b/sdk/python/examples/extensions/charts/scatter_chart/scatter_chart_with_error_bars/pyproject.toml @@ -0,0 +1,26 @@ +[project] +name = "charts-scatter-chart-with-error-bars" +version = "1.0.0" +description = "Scatter chart of pendulum measurements with horizontal and vertical error bars showing the uncertainty of each point." +requires-python = ">=3.10" +keywords = ["charts", "scatter-chart", "error-bars", "flet"] +authors = [{ name = "Flet team", email = "hello@flet.dev" }] +dependencies = ["flet", "flet-charts"] + +[dependency-groups] +dev = ["flet-cli", "flet-desktop", "flet-web"] + +[tool.flet.gallery] +categories = ["Charts/ScatterChart"] + +[tool.flet.metadata] +title = "Scatter chart with error bars" +controls = ["SafeArea", "ScatterChart"] +layout_pattern = "single-chart" +complexity = "basic" +features = ["chart visualization", "error bars"] + +[tool.flet] +org = "dev.flet" +company = "Flet" +copyright = "Copyright (C) 2023-2026 by Flet" diff --git a/website/docs/controls/charts/scatterchart.md b/website/docs/controls/charts/scatterchart.md index 523aab5487..cffba576ec 100644 --- a/website/docs/controls/charts/scatterchart.md +++ b/website/docs/controls/charts/scatterchart.md @@ -15,4 +15,6 @@ import {ClassMembers, ClassSummary, CodeExample, Image} from '@site/src/componen + + From d556eaa33d806871c2a6068da0c8ab701d97e270 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Thu, 24 Sep 2026 19:32:10 +0200 Subject: [PATCH 3/5] disable Yarn telemetry in documentation tasks --- sdk/python/Taskfile.yml | 3 +++ .../flet-charts/src/flet_charts/scatter_chart_spot.py | 8 ++++---- .../src/flutter/flet_charts/lib/src/utils/charts.dart | 1 - 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sdk/python/Taskfile.yml b/sdk/python/Taskfile.yml index 7fefbec623..0fe269a832 100644 --- a/sdk/python/Taskfile.yml +++ b/sdk/python/Taskfile.yml @@ -68,6 +68,8 @@ tasks: desc: "Start Docusaurus dev server for the documentation website with hot reload." aliases: - docs + env: + YARN_ENABLE_TELEMETRY: "0" cmds: - cd ../../website && yarn install --immutable - cd ../../website && yarn start @@ -78,6 +80,7 @@ tasks: - docs-fast env: FLET_DOCS_FAST: "1" + YARN_ENABLE_TELEMETRY: "0" cmds: - cd ../../website && yarn install --immutable - cd ../../website && yarn start diff --git a/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py b/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py index dbf2d6d725..c75a6572b7 100644 --- a/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py +++ b/sdk/python/packages/flet-charts/src/flet_charts/scatter_chart_spot.py @@ -92,8 +92,8 @@ class ScatterChartSpot(ft.BaseControl): in the color of this spot. Automatic axis bounds cover spot positions only, so set - :attr:`~flet_charts.ScatterChart.min_x` and - :attr:`~flet_charts.ScatterChart.max_x` to keep the error bar inside the chart. + :attr:`flet_charts.ScatterChart.min_x` and + :attr:`flet_charts.ScatterChart.max_x` to keep the error bar inside the chart. """ y_error: Optional[ChartErrorRange] = None @@ -102,8 +102,8 @@ class ScatterChartSpot(ft.BaseControl): in the color of this spot. Automatic axis bounds cover spot positions only, so set - :attr:`~flet_charts.ScatterChart.min_y` and - :attr:`~flet_charts.ScatterChart.max_y` to keep the error bar inside the chart. + :attr:`flet_charts.ScatterChart.min_y` and + :attr:`flet_charts.ScatterChart.max_y` to keep the error bar inside the chart. """ selected: bool = False diff --git a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart index 43dce6c478..42174d8103 100644 --- a/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart +++ b/sdk/python/packages/flet-charts/src/flutter/flet_charts/lib/src/utils/charts.dart @@ -167,7 +167,6 @@ AxisTitles parseAxisTitles(Control? control) { )); } -/// Parses a `ChartErrorRange` into an [FlErrorRange]. FlErrorRange? parseFlErrorRange(dynamic value, [FlErrorRange? defaultValue]) { if (value == null) return defaultValue; return FlErrorRange( From e7d8124f90faa61c087821523c893b7c527bd6ed Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Thu, 24 Sep 2026 19:54:38 +0200 Subject: [PATCH 4/5] Add PR link to changelog entries --- CHANGELOG.md | 2 +- sdk/python/packages/flet-charts/CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f2c56c304..b41db067c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ### Bug fixes -* flet-charts: Fix `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot by @ndonkoHenri. +* flet-charts: Fix `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot ([#6885](https://github.com/flet-dev/flet/pull/6885)) by @ndonkoHenri. ## 1.0.1 diff --git a/sdk/python/packages/flet-charts/CHANGELOG.md b/sdk/python/packages/flet-charts/CHANGELOG.md index b1968ed56d..5e73889cdd 100644 --- a/sdk/python/packages/flet-charts/CHANGELOG.md +++ b/sdk/python/packages/flet-charts/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed -- Fixed `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot by @ndonkoHenri. +- Fixed `ScatterChart` failing to render when a `ScatterChartSpot` has `x_error` or `y_error` set. Error ranges are now set with the new `ChartErrorRange` type and drawn as error bars in the color of their spot ([#6885](https://github.com/flet-dev/flet/pull/6885)) by @ndonkoHenri. ## 1.0.0 From 478d6dde4dfb09b409a77753ed1b381c4256e3fd Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Thu, 24 Sep 2026 20:49:05 +0200 Subject: [PATCH 5/5] Reject NaN bounds in ChartErrorRange `nan < 0` is false, so a NaN bound passed the non-negative check. `FlErrorRange` asserts both bounds are `>= 0`, so debug builds lost the chart again. Check the documented predicate itself, so NaN raises `ValueError` like a negative bound does. --- sdk/python/packages/flet-charts/src/flet_charts/types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/packages/flet-charts/src/flet_charts/types.py b/sdk/python/packages/flet-charts/src/flet_charts/types.py index 9a995bf535..dbd0fe0361 100644 --- a/sdk/python/packages/flet-charts/src/flet_charts/types.py +++ b/sdk/python/packages/flet-charts/src/flet_charts/types.py @@ -441,11 +441,11 @@ class ChartErrorRange: """ def __post_init__(self): - if self.lower_by < 0: + if not self.lower_by >= 0: raise ValueError( f"lower_by must be greater than or equal to 0, got {self.lower_by}" ) - if self.upper_by < 0: + if not self.upper_by >= 0: raise ValueError( f"upper_by must be greater than or equal to 0, got {self.upper_by}" )