Flutterの基本：最初のアプリプログラミング（第二部）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762420/8cfceb91-039e-4ad5-4f5f-5abadcf4a36a.png)
<h3><strong>ウィジェットを作成する</strong></h3>

<!-- wp:paragraph -->
<p>Flutterアプリのすべてが<strong>ウィジェット</strong>です！ したがって、Flutterで画面に表示される全ての要素が<strong>ウィジェット</strong>である。material.dart packageによって提供されるウィジェットには2つのタイプがあり、そのタイプの上で自分のカスタムウィジェットを構築します。それらは<strong>Statefulウィジェット</strong>と<strong>Statelessウィジェット</strong>です。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>このシリーズの今後の記事では、<strong>state</strong>、<strong>stateful widgets</strong> 、および<strong>stateless widgets</strong>について詳しく説明します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Flutter and Dartプラグインを設定する場合、IDEまたはエディターで独自のカスタムウィジェットが構築できます。Statelessまたはstatefulを入力するだけで、IDEがそれに応じて提案を行います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>以下の例では、<strong>MyApp</strong>という名前の<strong>statelessウィジェット</strong>を作成します。ウィジェットには任意の名前を選択できます。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre id="data-clipboard-target-3" class="wp-block-code"><code>class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>この例の通り、独自のカスタムstatelessウィジェットを作成するため、material package によって提供されるStatelessWidgetを拡張しています。<strong>@override</strong>は、<strong>material package</strong>によっても提供されるdecoratorです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ウィジェットはabstract classであり、ビルドメソッドをオーバーライドする必要があります。このメソッドには、Flutterが提供する<strong>BuildContext</strong>のコンテキストが必要です。このメソッド内で、設立又は表示が必要な<strong>ウィジェット</strong>を返します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>そこで、この例では、Flutterのmaterial.dartパッケージによって提供される組み込みウィジェットでもある<strong>MaterialApp</strong>を返します。このウィジェットは、コンストラクターで複数の引数を受け入れます。詳細については、<strong>Material App</strong> にカーソルを合わせるか、Command+クリック又はCtrl +MaterialAppウィジェットをクリックしてください。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MaterialAppの3つのパラメーター（タイトル、テーマ、ホーム）を定義する必要があります。タイトルは単に文字列を受け入れることです。 値として「First App Demo」を提供します。テーマは、Flutter material packageの組み込み型であるThemeDataデータ型の値が必要です。したがって、次の例のように初期化します。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre id="data-clipboard-target-4" class="wp-block-code"><code>ThemeData(primarySwatch: Colors.amber,),</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p><strong>ThemeData</strong>は、app Default themeを設定するために複数の値を受け入れます。primarySwatchは、<strong>MaterialColor</strong>タイプの値を受け入れる必須パラメーターです。これも組み込みタイプであり、Flutterがアプリのテーマを構築するためのColors.amberを提供するものです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>次に、ウィジェットタイプを受け入れるようにホームを設定する必要があります。ここで提供したウィジェットが画面に表示されます。そして、次のようなコンテナで初期化します：「home：Container（）,」。これはまもなくカスタムウィジェットに置き換えられます。ウィジェットは次のようになります。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre id="data-clipboard-target-5" class="wp-block-code"><code>class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'First App Demo',
      theme: ThemeData(
        primarySwatch: Colors.amber,
      ),
      home: Container(),
    );
  }
}</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3><strong>Main関数</strong></h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>アプリケーションを実行するには、main関数が必要です。main関数は、<strong>（）{...}</strong>の一般的な構文を使用するか、<strong>（）=></strong>の矢印関数として定義することで記述できます。両方の構文は以下のコードを見て見ましょう。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>void main() {
  runApp(MyApp());
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>又は：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>void main() =>runApp(MyApp());</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>上記の両方が正常に実行します。それでも、単一の値を返す必要がある場合は、矢印関数の方が良いと思います。そして、F5またはRun | Debugを押下してアプリケーションを実行すると、空白の画面が表示されます。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3><strong>Statefulウィジェットを作成する</strong></h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>FlutterにはStatelessとStatefulの2種類のウィジェットがあります。そのうち、Statefulウィジェットとは状態を持つウィジェットです。今回はStatefulWidgetを作成する方法を学習しましょう！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Statefulウィジェット</strong>を作成するには、statefulを入力してTabを押すで、IDE又はEditorのオートコンプリート機能を使用します。例えば、以下のようなDummyWidgetという名前のStatefulウィジェットを作成しています。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre id="data-clipboard-target-8" class="wp-block-code"><code>class DummyWidget extends StatefulWidget {
  @override
  _DummyWidgetState createState() =&gt; _DummyWidgetState();
}

class _DummyWidgetState extends State&lt;DummyWidget&gt; {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p><strong>Statefulウィジェッ</strong>トは<strong>Stateless ウィジェット</strong>に比べると、違う点があります。 例えば、Statefulウィジェットは内部データの変更に対応し、自体が再レンダリングで変更を反映します。一方、Stateless ウィジェットは自体が再レンダリングしません。そして、この課題については、今後の記事で詳しく説明します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Statefulウィジェットを理解するには、ある種の内部データが必要です。ここでは、_isGreenという名前のboolean値を使用して、デフォルトでfalseに初期化します。変数の前に_を付けて、<strong>Dart</strong>でのプライベート変数にし、このクラス内でのみアクセスできるようにしています。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>それとともに、Widget build（BuildContext context）{...}methodから空のコンテナーを返す代わりに、他の結果を返します！その結果はmaterial packageで提供されるウィジェットである<strong>Scaffold</strong>を返すことです。新しい/異なる画面を表示するたびに、Scaffoldを提供する必要があることに注意してください。そして、Scaffoldは、初期化の方法でいくつかのパラメーターを受け入れます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ここでは、appBarとbodyを提供して、画面にコンテンツをご覧になります。<strong>DummyWidget</strong>が次のように表示されます。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>class _DummyWidgetState extends State&lt;DummyWidget> {
  bool _isGreen = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: _isGreen ? Colors.green : Colors.red,
      appBar: AppBar(
        title: Text('Your First App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget>&#91;
            FlatButton(
              onPressed: () {
                setState(() {
                  _isGreen = !_isGreen;
                });
              },
              child: Text(_isGreen ? 'TURN RED' : 'TURN GREEN'),
            ),
          ],
        ),
      ),
    );
  }
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>このStateful DummyWidgetには、デフォルトが<span class="has-inline-color has-vivid-red-color">false</span>の<span class="has-inline-color has-vivid-red-color">_isGreen</span>という名前のbool型のprivate変数があります。コンテナを返す代わりに、Scaffoldウィジェットを返ます。そして、<span class="has-inline-color has-vivid-red-color">appBar</span>と<span class="has-inline-color has-vivid-red-color">body</span>の2つのパラメータを提供しました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>AppBarは、AppBar（）というvalue of type PreferredSizeWidgetを受け入れます。<span class="has-inline-color has-vivid-red-color">AppBar（）</span>は、設定するための他の多くのパラメーターも受け入れます。しかし、ここでは1つだけのパラメーターを使用してAppBarに表示されるtitleを設定します。そのうえ、Titleはウィジェットタイプを受け入れるため、組み込みの<span class="has-inline-color has-vivid-red-color">Text（）</span>ウィジェットを使用しています。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Bodyはウィジェットタイプも受け入れています。従って、組み込みの<span class="has-inline-color has-vivid-red-color">Column（）</span>ウィジェットを使用しています。デフォルトでは、カラムは画面の上から下に伸び、child widgetを囲みます。カラムにはmultiple widgetsをchildrenとして含めます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ここでは、<span class="has-inline-color has-vivid-red-color">FlatButton（）</span>という<span class="has-inline-color has-vivid-red-color">Column（）</span>ウィジェットの子が1つだけあります。そして、FlatButton（）は、material packageによって提供されるウィジェットでもあります。<span class="has-inline-color has-vivid-red-color">Flatbutton（）</span>には、1つの<span class="has-inline-color has-vivid-red-color">onPressed</span>パラメーターと1つのchildパラメーターがあります。<span class="has-inline-color has-vivid-red-color">onPressed</span>は、無名関数または事前に宣言された関数をその名前で受け入れます。この関数の内に書き込む内容は、ボタンがクリックするときに何が起こるかが決まります。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>この無名関数(anonymous function) の内では、再構築ウィジェットを有効にするため、<span class="has-inline-color has-vivid-red-color">setState（（）{...}）;</span>を使用しています。この場合のように内部で値を変更すると、設定した状態の内でのboolean _isGreenを変更します。各ボタンでは、この値が変更し、Statefulウィジェットを再レンダリング過程を行います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最後に、<span class="has-inline-color has-vivid-red-color">FlatButton（...）</span>の子要素として<span class="has-inline-color has-vivid-red-color">Text（ '...'）</span>ウィジェットを提供します。これは、ボタンの内に表示されるものを指定します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>また、StatelessWidget MyAppで、空のコンテナーを返す代わりに、カスタムのStatefulWidgetDummyWidgetを返します。カスタムウィジェットが画面に表示できることです。以下のmain.dartファイルをご覧ください。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'First App Demo',
      theme: ThemeData(
        primarySwatch: Colors.amber,
      ),
      home: DummyWidget(),
    );
  }
}

class DummyWidget extends StatefulWidget {
  @override
  _DummyWidgetState createState() => _DummyWidgetState();
}

class _DummyWidgetState extends State&lt;DummyWidget> {
  bool _isGreen = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: _isGreen ? Colors.green : Colors.red,
      appBar: AppBar(
        title: Text('Your First App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget>&#91;
            FlatButton(
              onPressed: () {
                setState(() {
                  _isGreen = !_isGreen;
                });
              },
              child: Text(_isGreen ? 'TURN RED' : 'TURN GREEN'),
            ),
          ],
        ),
      ),
    );
  }
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Flutterは素晴らしいフレームワークですね。この記事を通じて、Flutterを使用して最初のアプリケーションを作成できますね。我が社は、Flutterに関する役立つ情報を提供することを願っています。オフショア開発をご検討されている方々はぜひ一度ご相談ください。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br> ここまで最初のアプリプログラミング（第二部） は終わりです。次の記事でお会いしましょう! </p>
<!-- /wp:paragraph -->
[第一部はこちら](https://qiita.com/ints/items/b966c4ebfbc8200fa13c)
[株式会社INTS](https://ints.vn/)　開発部　レー・ジャン