fl_echarts

A Flutter package that brings the full power of Apache ECharts to your Flutter app via an embedded WebView — no JavaScript knowledge required.

Supported platforms: Android · iOS · macOS · Web · Windows

Linux: not yet supported (no viable webview backend available).


Features

  • Render any ECharts chart (line, bar, pie, scatter, candlestick, radar, map, …)
  • Dark mode support
  • Dynamic chart updates without rebuilding the widget
  • Manual showLoading / hideLoading control
  • Custom JavaScript execution
  • Resize API
  • EChartsController for full programmatic control
  • Callbacks: onChartReady, onMessage, onWebViewCreated

Getting started

1. Add the dependency

dependencies:
  fl_echarts: ^0.3.0

2. Platform setup

Android — no extra steps.

iOS / macOS — add to ios/Runner/Info.plist (iOS) or macos/Runner/Info.plist (macOS):

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsLocalNetworking</key>
  <true/>
</dict>

Web — no extra steps. Charts render inside an iframe using the browser's native rendering.

Windows — requires the WebView2 Runtime (pre-installed on Windows 10 21H2+ and all Windows 11). For older Windows 10 machines, users must install it from Microsoft. Follow the webview_windows setup guide for any additional project configuration.


Usage

Basic chart

import 'package:fl_echarts/fl_echarts.dart';

ECharts(
  height: 300,
  option: {
    'xAxis': {'type': 'category', 'data': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']},
    'yAxis': {'type': 'value'},
    'series': [
      {'type': 'bar', 'data': [120, 200, 150, 80, 70]},
    ],
  },
)

Using EChartsController

final _controller = EChartsController();

// In your widget
ECharts(
  height: 300,
  controller: _controller,
  option: _myOption,
  onChartReady: () {
    // Chart is rendered and ready
  },
)

// Update the chart data later
await _controller.updateChart(_newOption);

// Show/hide loading overlay
_controller.showLoading(text: 'Fetching data…');
await Future.delayed(const Duration(seconds: 2));
_controller.hideLoading();

// Trigger resize after layout changes
await _controller.resizeChart();

// Run arbitrary JavaScript
await _controller.executeJavaScript('echart.clear();');

// Clean up
_controller.dispose();

Dark mode

ECharts(
  height: 300,
  darkMode: true,
  option: _myOption,
)

Full widget parameters

Parameter Type Default Description
option Map<String, dynamic> required ECharts option object
width double? fills parent Widget width
height double? 400 Widget height
darkMode bool false Enable dark theme
controller EChartsController? — Programmatic control
onChartReady VoidCallback? — Called when chart finishes rendering
onMessage EChartsMessageCallback? — Raw JS→Flutter messages
onWebViewCreated VoidCallback? — Called when WebView is created

ECharts documentation

For the full list of chart types and option fields see the
official ECharts documentation.


License

MIT. See LICENSE.

Libraries

fl_echarts