본문으로 이동

플러터:그래프 그리기(fl chart): 두 판 사이의 차이

학교의 모든 지식. SMwiki
새 문서: {{플러터}} == 1. 개요 == Flutter에서 실시간 그래프를 그리기 위해 **슬라이더(Slider)** 위젯으로 값을 조정하고, 이를 **그래프 라이브러리(예: fl_chart)**와 연결하는 기본 구조를 정리한 문서이다. 본 문서에서는 다음을 다룬다: * Flutter 슬라이더 기본 속성 * 슬라이더와 상태관리 기본 구조 * fl_chart 기반 실시간 그래프 예시 구조 * 상태변화와 그래프 리빌드 흐름 == 2. S...
 
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
1번째 줄: 1번째 줄:
{{플러터}}
{{플러터}}


== 1. 개요 ==
== 개요 ==
Flutter에서 실시간 그래프를 그리기 위해 **슬라이더(Slider)** 위젯으로 값을 조정하고, 이를 **그래프 라이브러리(예: fl_chart)**와 연결하는 기본 구조를 정리한 문서이다.
Flutter에서 실시간 그래프를 그리기 위해 기본 구조를 정리한 문서.


본 문서에서는 다음을 다룬다:
=== 그래프 라이브러리 선택 ===
{| class="wikitable"
!라이브러리
!난이도
!특징
!공식 문서 링크
|-
|'''fl_chart'''
|쉬움
|가장 인기 많음, 애니메이션 최강
|• Pub.dev: https://pub.dev/packages/fl_chart
• GitHub: https://github.com/imaNNeoFighT/fl_chart
|-
|'''charts_flutter''' (Google)
|중간
|구글 Material 스타일, 구조 다소 복잡
|• Pub.dev: https://pub.dev/packages/charts_flutter
• GitHub: https://github.com/google/charts
|-
|'''syncfusion_flutter_charts'''
|중간~어려움
|기업용 기능 최강, 50종 이상 차트
|• 공식 Docs: https://help.syncfusion.com/flutter/charts/overview
• Pub.dev: https://pub.dev/packages/syncfusion_flutter_charts
|-
|'''graphic'''
|어려움
|D3.js 느낌의 선언형 그래프
|• Pub.dev: https://pub.dev/packages/graphic
• GitHub: https://github.com/entronad/graphic
|-
|'''bezier_chart'''
|쉬움
|간단한 곡선 차트
|• Pub.dev: https://pub.dev/packages/bezier_chart
• GitHub: https://github.com/aeyrium/bezier-chart
|-
|'''기타(sparkline 등)'''
|쉬움
|작은 미니차트용
|• charts_sparkline: https://pub.dev/packages/charts_sparkline
|}
 
== fl_chart를 이용한 실시간 그래프 구조 ==
슬라이더 값이 변경될 때마다 그래프에 표시되는 데이터 리스트를 업데이트하는 방식이 일반적이다.
 
=== 흐름 ===


* Flutter 슬라이더 기본 속성
# 슬라이더 변경 → onChanged 호출
* 슬라이더와 상태관리 기본 구조
# 데이터 리스트에 새로운 값 push
* fl_chart 기반 실시간 그래프 예시 구조
# 상태 업데이트
* 상태변화와 그래프 리빌드 흐름
# fl_chart가 리빌드되면서 새로운 그래프 출력


== 2. Slider 위젯 기본 ==
=== 그래프 위젯 기본 구조 ===
Flutter의 `Slider`는 숫자 값을 연속 또는 단계적으로 조정할 수 있는 입력 위젯이다.
<syntaxhighlight lang="dart">
LineChart(
  LineChartData(
    lineBarsData: [
      LineChartBarData(
        spots: dataPoints,
        isCurved: true,
        barWidth: 3,
      ),
    ],
  ),
)


=== 2.1. 기본 속성 목록 ===
</syntaxhighlight>
; **value**
: 현재 슬라이더의 값. (double)


; **min / max**
=== LineChartBarData 안의 속성들 ===
: 슬라이더의 최소/최대 범위를 지정
{| class="wikitable"
!속성
!설명
!비고
|-
|gradient
|그래프 선의 색상이 그라데이션을 이루게끔.
왼쪽, 오른쪽 색을 순서대로 넣는다.
|gradient: LinearGradient(


; **onChanged(double value)**
  colors: [Colors.blue, Colors.purple],
: 슬라이더가 움직일 때 호출되는 콜백. 상태 갱신 시 사용


; **divisions**
)
: 값을 단계로 제한. 예) divisions: 10 → 0~100 범위에서 10단계로 쪼개짐
|-
|gridData
|눈금선 관련
|// ★ 그리드(눈금선) 제거
gridData: const FlGridData(show: false),
|-
|titlesData
|축 관련
|// ★ 축 글자 없애기
titlesData: const FlTitlesData(


; **label**
  leftTitles: AxisTitles(
: `divisions`와 함께 사용 시, 현재 값을 툴팁 형태로 표시 가능


; **activeColor / inactiveColor**
    sideTitles: SideTitles(showTitles: false),
: 활성/비활성 트랙 색상


; **semanticFormatterCallback**
  ),
: 접근성을 위한 텍스트 변환


=== 2.2. Slider 코드 예시 ===
  rightTitles: AxisTitles(


```
    sideTitles: SideTitles(showTitles: false),
Slider(
  value: sliderValue,
  min: 0,
  max: 100,
  divisions: 20,
  label: sliderValue.toStringAsFixed(0),
  onChanged: (v) {
    setState(() {
      sliderValue = v;
    });
  },
)
```


== 3. 그래프 라이브러리 선택 ==
  ),
Flutter에서 자주 사용되는 그래프 라이브러리:


* **fl_chart** → 가장 널리 사용됨. 커스터마이징 다양. 실시간 그래프 가능.
  topTitles: AxisTitles(
* charts_flutter → 구글 제공. 구조는 안정적이나 커스텀 난이도가 약간 있음.
* graphic → 선언적 방식. Rx-like UI.


== 4. fl_chart를 이용한 실시간 그래프 구조 ==
    sideTitles: SideTitles(showTitles: false),
슬라이더 값이 변경될 때마다 그래프에 표시되는 데이터 리스트를 업데이트하는 방식이 일반적이다.


흐름:
  ),


1. 슬라이더 변경 → onChanged 호출
  bottomTitles: AxisTitles(
2. 데이터 리스트에 새로운 값 push
3. 상태 업데이트
4. fl_chart가 리빌드되면서 새로운 그래프 출력


=== 4.1. 데이터 구조 예시 ===
    sideTitles: SideTitles(showTitles: false),


```
  ),
List<FlSpot> dataPoints = [
  FlSpot(0, 0),
];
```


슬라이더 값 변경 시:
),
|}
이외 점 크기, 축, 테두리 등 다양한 방식으로 꾸밀 수 있음.


```
fl_chart는 기본값이 “모든 축 표시 + 기본 그리드”라서 꾸미지 않으면 좀 투박함;
setState(() {
  time++;
  dataPoints.add(FlSpot(time.toDouble(), sliderValue));
});
```


=== 4.2. 그래프 위젯 기본 구조 ===
== 전체 구성 예시 ==
<syntaxhighlight lang="dart">
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';


```
void main() {
LineChart(
   runApp(const GraphApp());
   LineChartData(
}
    lineBarsData: [
      LineChartBarData(
        spots: dataPoints,
        isCurved: true,
        barWidth: 3,
      )
    ],
  ),
)
```


== 5. 전체 구성 예시 (pseudo code) ==
class GraphApp extends StatelessWidget {
  const GraphApp({super.key});


```
  @override
double sliderValue = 50;
  Widget build(BuildContext context) {
int time = 0;
    return MaterialApp(
List<FlSpot> dataPoints = [FlSpot(0, 50)];
      home: GraphPage(),
      debugShowCheckedModeBanner: false,
    );
  }
}


Column(
class GraphPage extends StatefulWidget {
   children: [
   @override
    Slider(
  _GraphPageState createState() => _GraphPageState();
      value: sliderValue,
}
      min: 0,
      max: 100,
      divisions: 20,
      label: sliderValue.toStringAsFixed(0),
      onChanged: (v) {
        setState(() {
          sliderValue = v;
          time++;
          dataPoints.add(FlSpot(time.toDouble(), v));
        });
      },
    ),


    Expanded(
class _GraphPageState extends State<GraphPage> {
      child: LineChart(
  double sliderValue = 50;
        LineChartData(
  int time = 0;
          lineBarsData: [
  List<FlSpot> dataPoints = [FlSpot(0, 50)];  // 처음에 점 하나를 찍어야 에러가 안남.
            LineChartBarData(spots: dataPoints)
          ],
        ),
      ),
    )
  ],
)
```


== 6. 실시간 그래프 구현 시 팁 ==
  void _updateValue(double v) {
    setState(() {
      sliderValue = v;
      time++;
      dataPoints.add(FlSpot(time.toDouble(), v));


* 데이터가 너무 많아지면 성능이 떨어질 수 있으므로 일정 개수 이상 시 앞부분 제거
      // 오래되면 그래프가 너무 길어지므로 50개까지만 유지
* setState 외에 Provider, Riverpod, Bloc 등을 사용하면 구조가 더 깔끔해짐
      if (dataPoints.length > 50) {
* UI 안정성을 위해 그래프 업데이트 주기를 제한할 수도 있음 (예: 100ms마다 적용)
        dataPoints.removeAt(0);
      }
    });
  }


== 7. Flutter 그래프 라이브러리 비교 ==
  @override
아래는 주요 그래프 라이브러리들의 유지보수 상태, 난이도, 특징, 공식 문서 링크를 정리한 표이다.
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("실시간 그래프 예제")),
      body: Column(
        children: [
          // 그래프 영역
          Expanded(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: LineChart(
                LineChartData(
                  minY: 0,
                  maxY: 100,
                  lineBarsData: [
                    LineChartBarData(
                      spots: dataPoints,
                      isCurved: true,
                      barWidth: 3,
                      dotData: const FlDotData(show: false),
                    ),
                  ],
                ),
              ),
            ),
          ),


{| class="wikitable"
          // 슬라이더
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Slider(
              min: 0,
              max: 100,
              value: sliderValue,
              divisions: 20,
              label: sliderValue.toStringAsFixed(0),
              onChanged: _updateValue,
            ),
          ),
        ],
      ),
    );
  }
}


| ! 라이브러리 !! 유지보수 !! 난이도 !! 특징 !! 공식 문서 링크 !! 실시간 적합도 |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
</syntaxhighlight>
| --------------------------------------------------- | - | ----- | - | ------ | - | ------------------ | - | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ----- |
| '''fl_chart'''                                      |  | 활발    |  | 쉬움    |  | 가장 널리 사용, 애니메이션 우수 |  | [[https://pub.dev/packages/fl_chart](https://pub.dev/packages/fl_chart) pub.dev] / [[https://github.com/imaNNeoFighT/fl_chart](https://github.com/imaNNeoFighT/fl_chart) GitHub]                                                      |  | ⭐⭐⭐⭐⭐ |
| -                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
| '''charts_flutter''' (Google)                      |  | 거의 멈춤 |  | 중간    |  | Material 기반, 구조 복잡 |  | [[https://pub.dev/packages/charts_flutter](https://pub.dev/packages/charts_flutter) pub.dev] / [[https://github.com/google/charts](https://github.com/google/charts) GitHub]                                                          |  | ⭐⭐    |
| -                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
| '''syncfusion_flutter_charts'''                    |  | 매우 활발 |  | 중간~어려움 |  | 기업용 기능 최강, 50+ 차트  |  | [[https://help.syncfusion.com/flutter/charts/overview](https://help.syncfusion.com/flutter/charts/overview) Docs] / [[https://pub.dev/packages/syncfusion_flutter_charts](https://pub.dev/packages/syncfusion_flutter_charts) pub.dev] |  | ⭐⭐⭐⭐  |
| -                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
| '''graphic'''                                      |  | 활발    |  | 어려움    |  | D3.js 스타일 선언형 그래프  |  | [[https://pub.dev/packages/graphic](https://pub.dev/packages/graphic) pub.dev] / [[https://github.com/entronad/graphic](https://github.com/entronad/graphic) GitHub]                                                                  |  | ⭐⭐⭐  |
| -                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
| '''bezier_chart'''                                  |  | 정체    |  | 쉬움    |  | 간단한 곡선 그래프        |  | [[https://pub.dev/packages/bezier_chart](https://pub.dev/packages/bezier_chart) pub.dev] / [[https://github.com/aeyrium/bezier-chart](https://github.com/aeyrium/bezier-chart) GitHub]                                                |  | ⭐    |
| -                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |
| 기타(sparkline 등)                                    |  | 불규칙  |  | 쉬움    |  | 미니 차트용            |  | [[https://pub.dev/packages/charts_sparkline](https://pub.dev/packages/charts_sparkline) charts_sparkline]                                                                                                                              |  | ⭐⭐    |
| }                                                  |  |      |  |        |  |                    |  |                                                                                                                                                                                                                                        |  |      |


== 8. 다음 학습 추천 ==
== 실시간 그래프 구현 시 팁 ==


* Stream + StreamBuilder로 그래프 자동 갱신 구조 만들기
* 데이터가 너무 많아지면 성능이 떨어질 수 있으므로 일정 개수 이상 시 앞부분 제거
* 애니메이션 기능 사용한 그래프 부드럽게 업데이트
* UI 안정성을 위해 그래프 업데이트 주기를 제한할 수도 있음 (예: 100ms마다 적용)
* 여러 슬라이더를 사용한 다중 데이터 그래프 구현

2026년 1월 7일 (수) 02:13 기준 최신판

틀:플러터 Dart:개요 플러터에 대한 지식 분류

  1. 플러터:개요
    1. 플러터:VSCode
    2. 플러터:안드로이드 스튜디오
  2. 플러터:실행
  3. 플러터:개념 잡기
    1. 플러터:화면 하나 만들기
    2. 플러터:변하는 화면(StatefulWidget)
    3. 플러터:화면 전환(화면 쌓기, 하단 네비게이션 바)
    4. 플러터:화면 전환(Drawer)
    5. 플러터:입력 관련
      1. 플러터:버튼
      2. 플러터:키보드 입력
      3. 플러터:슬라이더
    6. 플러터:그래프 그리기(fl chart)
    7. 플러터:데이터 저장(간단한 데이터)
    8. 플러터:인증(Firebase 인증)(미완)
    9. 플러터:인증(OAuth2)(미완)
  4. 권한 사용
    1. 플러터:마이크 입력
  5. 위젯
    1. 플러터:아이콘
    2. 플러터:레이아웃 계열 위젯
    3. 플러터:네비게이션 계열 위젯
    4. 플러터:버튼
    5. 플러터:상태관리(미완)
  6. 플러터:DB연결
    1. 플러터:Firebase(미완)
    2. 플러터:MySQL(미완)
  7. 디자인
    1. 플러터:테마
    2. 플러터:앱바
  8. 플러터:배포
  9. 플러터:참고자료
  10. 플러터:위젯
    1. 플러터:공간배치용 위젯
  11. 플러터:라이브러리
    1. 플러터:logger

Flutter에서 실시간 그래프를 그리기 위해 기본 구조를 정리한 문서.

그래프 라이브러리 선택

[편집 | 원본 편집]
라이브러리 난이도 특징 공식 문서 링크
fl_chart 쉬움 가장 인기 많음, 애니메이션 최강 • Pub.dev: https://pub.dev/packages/fl_chart

• GitHub: https://github.com/imaNNeoFighT/fl_chart

charts_flutter (Google) 중간 구글 Material 스타일, 구조 다소 복잡 • Pub.dev: https://pub.dev/packages/charts_flutter

• GitHub: https://github.com/google/charts

syncfusion_flutter_charts 중간~어려움 기업용 기능 최강, 50종 이상 차트 • 공식 Docs: https://help.syncfusion.com/flutter/charts/overview

• Pub.dev: https://pub.dev/packages/syncfusion_flutter_charts

graphic 어려움 D3.js 느낌의 선언형 그래프 • Pub.dev: https://pub.dev/packages/graphic

• GitHub: https://github.com/entronad/graphic

bezier_chart 쉬움 간단한 곡선 차트 • Pub.dev: https://pub.dev/packages/bezier_chart

• GitHub: https://github.com/aeyrium/bezier-chart

기타(sparkline 등) 쉬움 작은 미니차트용 • charts_sparkline: https://pub.dev/packages/charts_sparkline

fl_chart를 이용한 실시간 그래프 구조

[편집 | 원본 편집]

슬라이더 값이 변경될 때마다 그래프에 표시되는 데이터 리스트를 업데이트하는 방식이 일반적이다.

  1. 슬라이더 변경 → onChanged 호출
  2. 데이터 리스트에 새로운 값 push
  3. 상태 업데이트
  4. fl_chart가 리빌드되면서 새로운 그래프 출력

그래프 위젯 기본 구조

[편집 | 원본 편집]
LineChart(
  LineChartData(
    lineBarsData: [
      LineChartBarData(
        spots: dataPoints,
        isCurved: true,
        barWidth: 3,
      ),
    ],
  ),
)

LineChartBarData 안의 속성들

[편집 | 원본 편집]
속성 설명 비고
gradient 그래프 선의 색상이 그라데이션을 이루게끔.

왼쪽, 오른쪽 색을 순서대로 넣는다.

gradient: LinearGradient(

  colors: [Colors.blue, Colors.purple],

)

gridData 눈금선 관련 // ★ 그리드(눈금선) 제거

gridData: const FlGridData(show: false),

titlesData 축 관련 // ★ 축 글자 없애기

titlesData: const FlTitlesData(

  leftTitles: AxisTitles(

    sideTitles: SideTitles(showTitles: false),

  ),

  rightTitles: AxisTitles(

    sideTitles: SideTitles(showTitles: false),

  ),

  topTitles: AxisTitles(

    sideTitles: SideTitles(showTitles: false),

  ),

  bottomTitles: AxisTitles(

    sideTitles: SideTitles(showTitles: false),

  ),

),

이외 점 크기, 축, 테두리 등 다양한 방식으로 꾸밀 수 있음.

fl_chart는 기본값이 “모든 축 표시 + 기본 그리드”라서 꾸미지 않으면 좀 투박함;

전체 구성 예시

[편집 | 원본 편집]
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';

void main() {
  runApp(const GraphApp());
}

class GraphApp extends StatelessWidget {
  const GraphApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GraphPage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class GraphPage extends StatefulWidget {
  @override
  _GraphPageState createState() => _GraphPageState();
}

class _GraphPageState extends State<GraphPage> {
  double sliderValue = 50;
  int time = 0;
  List<FlSpot> dataPoints = [FlSpot(0, 50)];  // 처음에 점 하나를 찍어야 에러가 안남.

  void _updateValue(double v) {
    setState(() {
      sliderValue = v;
      time++;
      dataPoints.add(FlSpot(time.toDouble(), v));

      // 오래되면 그래프가 너무 길어지므로 50개까지만 유지
      if (dataPoints.length > 50) {
        dataPoints.removeAt(0);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("실시간 그래프 예제")),
      body: Column(
        children: [
          // 그래프 영역
          Expanded(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: LineChart(
                LineChartData(
                  minY: 0,
                  maxY: 100,
                  lineBarsData: [
                    LineChartBarData(
                      spots: dataPoints,
                      isCurved: true,
                      barWidth: 3,
                      dotData: const FlDotData(show: false),
                    ),
                  ],
                ),
              ),
            ),
          ),

          // 슬라이더
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Slider(
              min: 0,
              max: 100,
              value: sliderValue,
              divisions: 20,
              label: sliderValue.toStringAsFixed(0),
              onChanged: _updateValue,
            ),
          ),
        ],
      ),
    );
  }
}

실시간 그래프 구현 시 팁

[편집 | 원본 편집]
  • 데이터가 너무 많아지면 성능이 떨어질 수 있으므로 일정 개수 이상 시 앞부분 제거
  • UI 안정성을 위해 그래프 업데이트 주기를 제한할 수도 있음 (예: 100ms마다 적용)