Kimama-IT

ITに関する覚書き

【Flutter/Dart】Future・async・awaitの使用例

公式ページのイントロダクションをもとにした使用例のメモです。

dart.dev

void main() {
  print('${DateTime.now()} すぐに表示');
  printWithDelay('1秒後に表示されるかな?');
  print('${DateTime.now()} すぐに表示?');
}

const oneSecond = Duration(seconds: 1);

Future<void> printWithDelay(String message) async {
  await Future.delayed(oneSecond);
  print('${DateTime.now()} $message');
}

/// 上と下のメソッドは同じ動作をする。

// Future<void> printWithDelay(String message) {
//   return Future.delayed(oneSecond).then((_) {
//     print('${DateTime.now()} $message');
//   });
// }

gitのプログラムをもとにした使用例のメモです。

github.com

void main() {
  xxx();
}

xxx() async {
  print('${formate(DateTime.now())}  xxx: 私は x です');
  print('${formate(DateTime.now())}  xxx: y を await します');
  await yyy();
  print('${formate(DateTime.now())}  xxx: y を await しました');
}

Future yyy() async {
  print('${formate(DateTime.now())}  yyy: 私は y です');
  print('${formate(DateTime.now())}  yyy: z を await します');
  await zzz();
  print('${formate(DateTime.now())}  yyy: z を await しました');
}

Future zzz() async {
  print('${formate(DateTime.now())}  zzz: 私は z です');
  print('${formate(DateTime.now())}  zzz: 通信中...しばらくお待ちください');
  await Future.delayed(const Duration(seconds: 1));
  print('${formate(DateTime.now())}  zzz: 1秒後です');
}

String formate(DateTime datetime) {
  return "${datetime.hour}:${datetime.minute}:${datetime.second}.${datetime.millisecond}";
}

Flutterの初期カウントアップのプログラムに適用したときのメモです。

以下のサイトを参考にさせていただきました。
qiita.com

import 'package:flutter/material.dart';
import 'dart:io';

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(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
      print('onPressed インクリメントしました。');
    });
  }

  void _setCounter(int num) {
    setState(() {
      _counter = num;
    });
  }

  @override
  void initState() {
    print("MyHomePage画面が表示されました。");
    Async().asynctest3AndSetCount(_setCounter);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class Async {
  void asynctest1() {
    print("method begin");
    print(DateTime.now().toString());
    print("data1 start");
    print(syncFunc("data1", 3));
    print("data2 start");
    print(syncFunc("data2", 2));
    print("data3 start");
    print(syncFunc("data3", 1));
  }

  void asynctest2() {
    print("method begin");
    print(DateTime.now().toString());
    print("data1 start");
    print(asyncFunc("data1", 3));
    print("data2 start");
    print(asyncFunc("data2", 2));
    print("data3 start");
    print(asyncFunc("data3", 1));
  }

  void asynctest3() async {
    print("method begin");
    print(DateTime.now().toString());
    print("data1 start");
    Future<String> result1 = asyncFunc("data1", 3);
    result1.then((result) {
      print(result);
    });
    print("data2 start");
    Future<String> result2 = asyncFunc("data2", 2);
    result2.then((result) {
      print(result);
    });
    print("data3 start");
    Future<String> result3 = asyncFunc("data3", 1);
    result3.then((result) {
      print(result);
    });
  }

  void asynctest3AndSetCount(Function setCounter) async {
    print("method begin");
    print(DateTime.now().toString());
    print("data1 start");
    Future<String> result1 = asyncFunc("data1", 8);
    result1.then((result) {
      print(result);
      setCounter(1000);
      print('data1 _Counterを1000に設定しました。');
    });
    print("data2 start");
    Future<String> result2 = asyncFunc("data2", 5);
    result2.then((result) {
      print(result);
      setCounter(2000);
      print('data2 _Counterを2000に設定しました。');
    });
    print("data3 start");
    Future<String> result3 = asyncFunc("data3", 2);
    result3.then((result) {
      print(result);
      setCounter(3000);
      print('data3 _Counterを3000に設定しました。');
    });
  }

  void asynctest4() async {
    print("method begin");
    print(DateTime.now().toString());
    print("data1 start");
    print(await asyncFunc("data1", 3));
    print("data2 start");
    print(await asyncFunc("data2", 2));
    print("data3 start");
    print(await asyncFunc("data3", 1));
  }

  // timeの時間分スリープし、その後現在時間を返す関数
  String syncFunc(String name, int time) {
    sleep(Duration(seconds: time));
    return name + ":" + DateTime.now().toString();
  }

  // timeの時間分スリープし、その後現在時間を返す関数
  Future<String> asyncFunc(String name, int time) async {
    return Future.delayed(Duration(seconds: time), () {
      return name + ":" + DateTime.now().toString();
    });
  }
}