🌏

FlutterのControllerの使い方

に公開

FlutterのControllerの使い方

1. はじめに

Flutterアプリケーションを開発する際、状態管理やUIの制御を効率的に行うためにControllerが重要な役割を果たします。本記事では、FlutterでのControllerの基本的な使い方から応用例までを解説します。

2. 基本的な概念

Controllerとは?

Controllerは、UIコンポーネントとアプリケーションのロジックをつなぐ役割を持つオブジェクトです。例えば、テキストフィールドの値を管理したり、スクロール位置を制御したりする際に使用されます。

よく使われるControllerの種類

  • TextEditingController: テキストフィールドの値を管理
  • ScrollController: スクロール位置の制御
  • AnimationController: アニメーションの制御

3. TextEditingControllerの使い方

基本的な使用例

以下は、TextEditingControllerを使ってテキストフィールドの値を取得・更新する例です。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TextFieldExample(),
    );
  }
}

class TextFieldExample extends StatefulWidget {
  
  _TextFieldExampleState createState() => _TextFieldExampleState();
}

class _TextFieldExampleState extends State<TextFieldExample> {
  final TextEditingController _controller = TextEditingController();

  
  void dispose() {
    _controller.dispose(); // メモリリークを防ぐためにdisposeを呼び出す
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('TextEditingController Example')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'Enter text'),
            ),
            ElevatedButton(
              onPressed: () {
                print('Text: ${_controller.text}');
              },
              child: Text('Print Text'),
            ),
          ],
        ),
      ),
    );
  }
}

4. ScrollControllerの使い方

基本的な使用例

ScrollControllerを使ってスクロール位置を制御する例を紹介します。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScrollControllerExample(),
    );
  }
}

class ScrollControllerExample extends StatefulWidget {
  
  _ScrollControllerExampleState createState() => _ScrollControllerExampleState();
}

class _ScrollControllerExampleState extends State<ScrollControllerExample> {
  final ScrollController _scrollController = ScrollController();

  
  void dispose() {
    _scrollController.dispose(); // メモリリークを防ぐためにdisposeを呼び出す
    super.dispose();
  }

  void _scrollToTop() {
    _scrollController.animateTo(
      0.0,
      duration: Duration(seconds: 1),
      curve: Curves.easeInOut,
    );
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('ScrollController Example')),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              controller: _scrollController,
              itemCount: 50,
              itemBuilder: (context, index) => ListTile(title: Text('Item $index')),
            ),
          ),
          ElevatedButton(
            onPressed: _scrollToTop,
            child: Text('Scroll to Top'),
          ),
        ],
      ),
    );
  }
}

5. カスタムControllerの作成

独自のControllerを作成することで、特定のロジックを再利用可能にすることができます。

実装例

以下は、カウンターのロジックを管理するカスタムControllerの例です。

import 'package:flutter/material.dart';

class CounterController {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
  }

  void decrement() {
    _count--;
  }
}

6. Controllerを使う際の注意点

Controllerを使用する際には、以下の点に注意してください。

  • disposeの呼び出し
    TextEditingControllerScrollControllerなどのControllerは、使用後にdisposeメソッドを呼び出してリソースを解放する必要があります。これを怠ると、メモリリークの原因になります。

  • 過剰な依存を避ける
    Controllerに過剰なロジックを詰め込むと、コードの保守性が低下します。ControllerはあくまでUIとロジックをつなぐ役割に留め、複雑なロジックは別のクラスやサービスに分離することを推奨します。

7. まとめ

Controllerを活用することで、UIとロジックの分離が容易になり、コードの再利用性が向上します。本記事で紹介したTextEditingControllerScrollControllerの基本的な使い方を参考に、Flutterアプリケーションの開発に役立ててください。また、カスタムControllerを作成することで、特定のロジックを効率的に管理することも可能です。

8. 参考資料

Discussion