文系プログラマーが語る

主にプログラミング関連の記事を書いています。

【Flutter】ローディングのぐるぐるサンプル【コピペOK!】

今回は、アプリで処理を待つ間に表示されるローディングのあのぐるぐるを実装するサンプルです。関数を作ってあるのでメソッドをコピペして呼び出してもらえればすぐに実装できます!

 

この記事で分かること

✅ローディングのぐるぐるの実装方法

 

目次

 

サンプル画面

以下画面のようにボタン押下で一定時間ローディング画面が表示されるサンプルです。

 

サンプルコード

全文(main.dart

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'ローディングサンプル'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<myhomepage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            showLoading(context);//ローディング画面呼び出し

            await Future.delayed(Duration(seconds: 3));//今回は例で3秒待機する処理を入れてます(つまり3秒ローディング画面が表示される)

            Navigator.of(context).pop();//ローディング画面を閉じる
          },
          child: const Text("ローディング"),
        ),
      ),
    );
  }
}

//ローディング用関数
void showLoading(BuildContext context) {
  showDialog(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return Dialog(
        child: Row(
          mainAxisSize: MainAxisSize.min,
          children: const [
            CircularProgressIndicator(),
            Text("ローディング"),
          ],
        ),
      );
    },
  );
}

 

実装手順の説明

①ローディング関数作成
//ローディング用関数
void showLoading(BuildContext context) {
  showDialog(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return Dialog(
        child: Row(
          mainAxisSize: MainAxisSize.min,
          children: const [
            CircularProgressIndicator(),
            Text("ローディング"),
          ],
        ),
      );
    },
  );
}

自作したshowLoading()関数の中で使用しているshowDialog()は任意のダイアログを表示するためのFlutter関数です。barrierDismissibleをfalseとすることでローディング中にユーザがタップをして画面が戻ることがなくなります。

CircularProgressIndicator()は回転する円形の進行状況インジケーターです。要はぐるぐるです。笑

showDialog function - material library - Dart API
CircularProgressIndicator class - material library - Dart API

 

②①を呼び出す
showLoading(context);//ローディング画面呼び出し

 

③時間のかかる処理を記述する
await Future.delayed(Duration(seconds: 3));//今回は例で3秒待機する処理を入れてます(つまり3秒ローディング画面が表示される)

 

④ローディング画面を閉じる
Navigator.of(context).pop();//ローディング画面を閉じる

これは、ローディング画面から元画面に戻るために記述した処理です。ローディング画面というのは今の画面(ローディングをする画面)の上に画面が重なっている状態となります。そのため、もしローディング後に元画面に戻る必要があるならこれを記述しないとずっとぐるぐると回り続けてしまいます。

ここら辺の画面スタックや遷移の話については以下記事を参考にしてみてください。

 

まとめ

今回はFlutterで画面のローディングを実装するサンプルでした。非同期処理や時間のかかる処理を行う際にはお世話になると思うのでこの機会にぜひ理解を深めていきましょう!

最後までお読みいただきありがとうございました!