LoginSignup
0
1

More than 1 year has passed since last update.

Flutter で背景色がきれいに切り替わるチュートリアル画面を作る

Posted at

モチベーション

Flutter でよくあるチュートリアル画面を作成するために flutter_sliding_tutorial を使って、、という記事はよくあるのですが、背景色がきれいに切り替わるようにするには?という記事は見かけなかったので書いてみました。

こんな感じのチュートリアル画面を作成します。

環境

flutter_sliding_tutorial を使ったチュートリアル画面

ポイントは AnimatedBackgroundColor で背景色を指定してあげることです。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_sliding_tutorial/flutter_sliding_tutorial.dart';

void main() => runApp(const TutorialPage());

class TutorialPage extends StatefulWidget {
  const TutorialPage({Key? key}) : super(key: key);

  @override
  State<TutorialPage> createState() => _TutorialPageState();
}

class _TutorialPageState extends State<TutorialPage> {
  static const int _maxPage = 5;

  static const _colors = [
    Colors.greenAccent,
    Colors.amberAccent,
    Colors.blueAccent,
    Colors.deepOrangeAccent,
    Colors.deepPurpleAccent,
  ];

  static const _icons = [
    Icon(Icons.home, size: 160),
    Icon(Icons.light_mode, size: 160),
    Icon(Icons.star, size: 160),
    Icon(Icons.favorite, size: 160),
    Icon(Icons.thumb_up, size: 160),
  ];

  final _ctrl = PageController();
  final _notifier = ValueNotifier(0.0);

  @override
  void initState() {
    // 全画面 - 開始
    SystemChrome.setEnabledSystemUIMode(
      SystemUiMode.manual,
      overlays: [],
    );

    // ページ番号を通知
    _ctrl.addListener(() => _notifier.value = _ctrl.page!);

    super.initState();
  }

  @override
  void dispose() {
    _ctrl.dispose();
    _notifier.dispose();

    // 全画面 - 終了
    SystemChrome.setEnabledSystemUIMode(
      SystemUiMode.manual,
      overlays: SystemUiOverlay.values,
    );

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: AnimatedBackgroundColor(
          pageController: _ctrl,
          pageCount: _maxPage,
          colors: _colors,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Expanded(
                child: PageView(
                  controller: _ctrl,
                  children: List<Widget>.generate(
                    _maxPage,
                    (index) => Center(child: _icons[index]),
                  ),
                ),
              ),
              SlidingIndicator(
                indicatorCount: _maxPage,
                notifier: _notifier,
                inactiveIndicatorSize: 24,
                inActiveIndicator: const Icon(
                  Icons.radio_button_unchecked,
                  color: Colors.white,
                  size: 24,
                ),
                activeIndicatorSize: 24,
                activeIndicator: const Icon(
                  Icons.check_circle,
                  color: Colors.white,
                  size: 24,
                ),
              ),
              const SizedBox(height: 32),
            ],
          ),
        ),
      ),
    );
  }
}

さいごに

上の例では説明のためにアイコンを切り替えているだけですが、この部分を透過の PNG にするなどすれば、きれいなチュートリアル画面の完成です。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1