もっぺんプログラミング(´・ω・`)

もっぺん頑張って副業プログラマを目指してます。

100日後にFlutter生活:5日目②:画面遷移をやってみる

Flutter モバイルアプリ開発バイブル という本を見ながら、画面遷移のサンプルコードを実装してみた。

ここまでで、単一画面を作って、画面にボタンを置いて、押されたらテキストを変える。くらいは出来るようになっていたので、それを応用して遷移ロジックを追加するのは、理解しやすかった。

遷移元、遷移先で値の受け渡しもできたし。 (一部、理解できてないコードがあるけど)

じわじわと理解が広がってきて嬉しい。

まだ、自由にレイアウト出来るレベルではないので、そのあたりはもう少し頑張りたい。

というか眠すぎるので寝ます。

100日後にFlutter生活:5日目①:これまでの振り返り

これまで勉強した内容を頭で整理して、ババっと超簡単なアプリは書けるようになった。

  • ボタン1個、テキスト1個
  • ボタンを押したら、カウントアップした数字をテキストに表示
  • ボタン押したイベント、ステータス管理(カウンタ)、ステータスを表示(テキストに表示)
  • マテリアルデザイン

ちょっと書けるようになったかも。と思えるレベル感としては

  • プログラムを書くときに、アウトラインがイメージできてる。 「main メソッド書いて、StatefulWidgetとStateのクラス作って、ステータス管理とボタン押したイベントは、同じクラス内で書けばOKなんだな」みたいな。
  • クラス定義とメソッド宣言は、ほぼ本を見ないで書ける。
  • でも細かい部分やレイアウト調整方法など、Widgetを使いこなす引き出しは、まだまだ。本を見ないと分からないレベル。

かなと思う。

本を見ないで6割くらい書けて、細かいところは「あれー?どうやって書くんだっけ?本見ようっと」みたいな感覚が持てれば 「ちょっと書けるようになってきたな。よしよし」と思えるってことだな。

そして、この感覚を身につけるには、自分的には、簡単なコードを繰り返し写経するのが なんだかんだで、一番早いような気がする。

import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget{
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp>{
  int _counter = 0;

  @override 
  Widget build(BuildContext context) => MaterialApp(
    theme: ThemeData(
      primarySwatch: Colors.blue
    ),
    home: Scaffold(
      appBar: AppBar(title: Text('appBarだよ')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            FlatButton(
              child: Text('PUSH ME!'),
              onPressed: () => {
                setState((){
                  _counter ++;
                })
              },
            ),
            Text('$_counter')
          ],
        )
      )
    )
  );
}

f:id:momoizo:20210109152522p:plain
こんなん出来ました。

100日後にFlutter生活:4日目:寝落ちしました。

4日目にして、仕事が遅くて何もせず寝落ちしてしまった…

まぁ、そんな日もある。 こういう脱力も許容しながらいこ。

とりあえず100日は続けたい。

明日は、やるぞ!

中身が無いのもアレなので、好きなYoutube動画を貼っとこ。 有名なやつであれですが。

youtu.be

100日後にFlutter生活:3日目:電卓の写経おわり

昨日からの続きで、Flutterで電卓を作ってみました。 とりあえず動いた。

2357developnote.blogspot.com

良いサンプルでした! 元記事のかた、ありがとうございました〜。

ソースコード的に気になるところもあったけど、やっぱり手を動かすと、写経でも頭に入ってきていいな。 眠いので、簡単にメモ…

■良かった点 * Classが細かく別れたサンプルだったので、Dart の書き方や、ソースの分割方法が、なんとなく分かった。 * 配列や分岐などの基本構文も理解できた。 * 非同期ライブラリの簡単な使い方が分かった。

■今後、理解を深めたい点 * ボタンのイベントと計算処理をリンクさせるため、いろんなものが static になっているが別の実装方法がありそう。 * 文字列と数値操作とか、ロジックの細かい部分を書き換えてみたい。

明日は、画面遷移を作ってみたいな。 良いサンプルが見つかるといいけど…

100日後にFlutter生活:2日目:電卓を写経する

画面上でイベントを拾えたなら、改めて、簡単なアプリを作って 入力、出力、レイアウトをやってみる。

よくやるのは、電卓作成。 いい感じの記事を見つけたので、このサイトのコードを写経させてもらおうっと。

2357developnote.blogspot.com

・・・30分後

んー、コンパイルエラーぽいものが出てしまった。 調べたい!直したい!

しかし・・・眠すぎる!

ねよ・・・・

100日後にFlutter生活:1日目:タップイベントを作る

某100日後に〜から、タイトルアイデアを拝借してみました。

改めて「100日後」って良い設定だなぁ。 3ヶ月、何かを毎日できれば、きっとどこかにたどり着けるはず。

1日10分でも継続してみよう。(と、今日は全然時間がとれないことを、前向きに言い訳しておくw)

Flutter 再開の初日は、タップイベントの制御をやってみます。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      title: 'Hello World',
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.white,
        ),
        body: FlatButton(
          child: Text("クリックしてみそ"),
          onPressed: (){
            print("クリックされた!?");
          }
        ),
      ),
    );
  }
}

ボタンをクリックしたら、デバッグコンソールにテキストが表示される!

まずは、ここから。

参考にしたサイト:

【Flutter】クリックイベントの実装【日本語】 | 夢と働き方と日々の生活 x 革命

Flutter動画やってみよ(eBook)4

以下のYoutubeの動画を、実際になぞっていきます。

前回は、こちら。

Flutter動画やってみよ(eBook)3 - もっぺんプログラミング(´・ω・`)

ベスト商品の掲載枠の追加

今日のベスト商品(Best of the day)を表示するエリアを追加していきます。

先程のSingleChildScrollView (商品を横スクロールさせていたWidget)の下に追加していきます。

), // ← SingleChildScrollViewの閉じカッコ
Padding(
  padding: EdgeInsets.symmetric(horizontal: 24), 
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      RichText(
        text: TextSpan(
          style: Theme.of(context).textTheme.display1,
          children: [
            TextSpan(text: "Best of the "),
            TextSpan(
              text: "day",
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ],
        ),
      ),
      Container(
        margin: EdgeInsets.symmetric(vertical: 20),
        width: double.infinity,
        height: 205,
        child: Stack(
          children: <Widget>[
            Positioned(
              bottom: 0, 
              left: 0,
              child: Container(
                height: 185, 
                width: double.infinity,
                decoration: BoxDecoration(
                  color: Color(0xFFEAEAEA).withOpacity(.45),
                  borderRadius: BorderRadius.circular(29),
                ),
              ),
            ),
            Positioned(
              right: 0,
              top: 0,
              child: Image.asset("assets/images/book-3.png"),
              width: size.width * .37,
            ),
          ],
        ),
      ),
    ],
  )
)

これで、こんな感じのエリアが追加されます。
(Best of the day からのエリア)

f:id:momoizo:20200531022254p:plain:w300

上下段レイアウトのために、Columnを追加しています。
タイトルはRichTextで表現し、本の画像を置いているグレーのエリアは、Containerを使っています。

このコンテナ内に、本の説明文・お気に入りボタン・評価を追加していきます。

まず、テキストの表示箇所をコンテナの少し内側になるように、コンテナ内にPaddingをセットします。

child: Container(
  padding: EdgeInsets.only(
    left: 24,
    top: 24,
    right: size.width * .35,
  ),

次に、コンテナのBoxDecoration の閉じタグ以降に以下を追加します。

), // ← BoxDecoration の閉じタグ
child: Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
    Text(
      "New York Time Best For 11th March 2020",
      style: TextStyle(
        fontSize: 9,
        color: kLightBlackColor,
      ),
    ),
    SizedBox(height: 5),
    Text(
      "How To Win \nFriends & Influence",
      //style: Theme.of(context).textTheme.title, // ← ビデオのコードはDuplicatedだったため、書き直しました。
      style: TextStyle(
      fontSize: 16,
      fontWeight: FontWeight.bold,
    ),
    Text(
      "Gary Venchuk",
      style: TextStyle(color: kLightBlackColor),
    ),
    SizedBox(height: 10),
    Row(
      children: <Widget>[],
    )
  ],
)

f:id:momoizo:20200531030701p:plain:w300

テキストの下にレーティングを追加します。
レーティングは、BookRating としてWigetに切り出しているので、それを使います。

説明テキストも合わせて以下のようなコードです。

Row(
  children: <Widget>[
    BookRating(score: 4.8), // ← BookRatingを追加
    SizedBox(width: 10),
    Expanded(
      child: Text(
        "When the earth was flat and everyone wanted to win the game of the best and people…",
        maxLines: 3,
        overflow: TextOverflow.ellipsis,
        style: TextStyle(
          fontSize: 10,
          color: kLightBlackColor,
        )
      )
    )
  ],
)

f:id:momoizo:20200531032432p:plain:w300

こんな感じになりました。
最後に、”Read”ボタンを追加します。

Positioned(
  right: 0,
  top: 0,
  child: Image.asset("assets/images/book-3.png"),
  width: size.width * .37,
),
Positioned( // ← ボタン追加
  bottom: 0,
  right: 0,
  child: SizedBox(
    height: 40,
    width: size.width * .3,
    child: TwoSideRoundedButton(
      text: "Read",
      radious: 24,
      press: () {},
    )
  )
)

f:id:momoizo:20200531033924p:plain:w300

最後に、コードの読みやすさのために Container を別メソッドに切り出します。
動画だと、ショートカットから「Extract Method」を選択して実行しています。

が、、、これが自分の環境だと出てこず…
手動で、メソッドに変換しました。

↓以下のような感じです。

                  ), // ← RichText の閉じタグ
                  bestOfTheDayCard(size, context), // ← もともと、Containerを記載していた箇所。
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// ↓ 切り出したメソッド。return の後ろに、Container のコードを貼り付けます。
Container bestOfTheDayCard(Size size, BuildContext context) {
  return Container(

次に、この下にオススメ欄を追加していきます。
つづきます。

たとえる技術

たとえる技術

  • 作者:せきしろ
  • 発売日: 2016/10/12
  • メディア: 単行本(ソフトカバー)