【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part33 Dartの特徴

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part33 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part32 Dartの特徴

今回はasync/awaitについて学習します。

Dartの特徴

async/await

なにやら難しいものなのかと思ったのですがどうやらFutureのシンタックスシュガーとのことです😄

早速おさらいです。

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part30 Dartの特徴

前回のコードを少し改良しました。findCompanyNameに注目します。

class User {
  String name = '';
  int company = 1;
  User(this.name);
}
class Company {
  int id;
  Company(this.id);
}

Future<User> fetchUser(String id) {
  return Future((){
    // ★
    return User(id);
  });
}

Future<Company> fetchCompany(int companyId) {
  return Future(() {
    // ▲
    return Company(companyId);
  });
}

// 前回のmain関数を少し変更
Future<int> findCompanyCode(){ // 旧 : void main() {
  print('1');
  var v =  fetchUser("raika").then((User user) {
    // user変数は★のオブジェクトが入っている
    print('3');
    return fetchCompany(user.company);
  }).then((Company company) {
    // company変数には▲のオブジェクトが入っている。
    // 成功した処理
    print('4');
    // 追加
    return company.id;
  }).catchError((error){
    // エラー処理
    print('4');
    // 追加
    return -1;
  }).whenComplete((){
    // どちらかが終わったら呼ばれる
    print('5');
  });
  print('2');
  
  return v;
}

// 新しくmainを創設。async/await使わないとFuture<int>から値を取り出せない・・・。
void main() async{
  print(await findCompanyCode());
}

findCompanyNameasync/awaitにしてみます。
この時、catchErrorwhenCompleteは使えないそうです。

代替として、try-catch-finallyを使うとのこと。

( ^ω^)・・・結局ここにたどり着くわけですか!

class User {
  String name = '';
  int company = 1;
  User(this.name);
}
class Company {
  int id;
  Company(this.id);
}

Future<User> fetchUser(String id) {
  return Future((){
    // ★
    return User(id);
  });
}

Future<Company> fetchCompany(int companyId) {
  return Future(() {
    // ▲
    return Company(companyId);
  });
}

Future<int> findCompanyCode() async {
  print('1');
  var companyId = 0;
  
  try {
    var user = await fetchUser("raika");
    print('3');
    var company = await fetchCompany(user.company);
    print('4');
    
    companyId = company.id;
  } catch (e) {
    print('4');
    companyId = -1;
  } finally {
    print('5');
  }
  
  print('2');
  
  return companyId;
}

// 新しくmainを創設。async/await使わないとFuture<int>から値を取り出せない・・・。
void main() async{
  print(await findCompanyCode());
}

この結果は「1 3 4 5 2 1」となります。

最後に

断然async/awaitを使用した方が(私には)わかりやすいですね!

Future(then-catchError-whenComplete)の構文って使うことあるのでしょうか?
JavaScriptから参加したエンジニアの方はこちらの方がわかりやすいのかもしれないと勝手なことを思いました。

async/awaitしか勝たん!

今日はここまで!