質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

2回答

587閲覧

Stateクラスへのアップキャストは今後推奨されるのか

defeatist

総合スコア35

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

1クリップ

投稿2023/01/06 16:25

編集2023/01/07 05:33

前提

Flutterを最近始めたのですが、私がインストールしたFlutterでは、新しいプロジェクトを作成した際に生成されるmain.dartの中で、以下のような変更があったようです。

dart

1//旧 2class MyHomePage extends StatefulWidget { 3 MyHomePage({Key key, this.title}) : super(key: key); 4 ... 5 6 _MyHomePageState createState() => _MyHomePageState(); 7} 8 9class _MyHomePageState extends State<MyHomePage> { 10 int _counter = 0; 11 ... 12} 13 14//新 15class MyHomePage extends StatefulWidget { 16 const MyHomePage({super.key, required this.title}); 17 ... 18 19 State<MyHomePage> createState() => _MyHomePageState(); 20} 21 22class _MyHomePageState extends State<MyHomePage> { 23 int _counter = 0; 24 ... 25}

上記のように、以前まではcreateState()の戻り値の型が_MyHomePageStateクラス(State<MyHomePage>のサブクラス)でしたが、私がインストールしたFlutterでは、戻り値の型がState<MyHomePage>クラス(_MyHomePageStateクラスのスーパークラス)になっていました。
スーパークラスへのアップキャストを行っているので、_counterが参照されなくなり、実行時にエラーが発生したり動作がおかしくなったりするのではないかと考えました。しかし、実際に実行してみると、エラーも発生せず動作も正常(カウンターの初期値が0)でした。

分からないこと

このmain.dartでは正常に動作しましたが、その他の場合でこのような新しい記述をした場合、動作がおかしくなったりなどする可能性はあるのでしょうか?

また、わざわざこのようなアップキャストを行う形に変更されたということは、今後はこちらの記述が推奨されるのでしょうか?

試したこと

以下のページでは新しい方のものが記載されていましたが、戻り値の型については言及されていませんでした。
createState method - StatefulWidget class - widgets library - Dart API

補足情報(FW/ツールのバージョンなど)

Flutter 3.3.10 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 135454af32 (3 weeks ago) • 2022-12-15 07:36:55 -0800
Engine • revision 3316dd8728
Tools • Dart 2.18.6 • DevTools 2.15.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

1

ベストアンサー

もともとがStatefulWidgetState createState();をオーバライドしているものなので問題ないです。
受け取り側の型はState<StatefulWidget>ですし。
State createState() => _MyHomePageState();としても動きます。


  • Stateはabstract class State<T extends StatefulWidget> with Diagnosticableという宣言なので、ジェネリックパラメータを省略した場合はState<StatefulWidget>と同等になります。

また提示されているひな形をgithubで見たところ、May 11, 2021にコミットされていました。
修正の要件は、linterへの対応のようようです。
library_private_types_in_public_api に引っかかったようです。
(パブリック API でプライベート型を使用することは避けてください。という内容)

MyHomePageがパブリッククラスなので、その中のパブリックメソッドに_MyHomePageStateを返す書き方ではlinterに引っかかるので、引っかからない書き方に変更したのでしょう。

投稿2023/01/07 02:06

ta.fu

総合スコア1662

jhashimoto👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1

これまでのFlutterチーム/コミュニティの振る舞いを踏まえると、仮にその破壊的変更があったならほぼ確実に然るべき組織から大々的にお知らせがあるはずなので、そういうのがあればそれに従うといいと思います。

そういうのは特に聞かないので、Flutterを使って開発する立場なら現時点で特に気にする必要は無いような気がします。
具体的に不具合が出たら対処する、というスタンスで問題無いと思います。

Flutter自体を開発する立場なら気にする必要はあるかもしれませんが。

記述については、IDEのコード補完を使うとその箇所は自動でコード補完してくれるので、それに任せるのがいいと思います。
(例えばstlessと入力して出てきた選択肢から選択するとStatelessWidgetの雛形コードが自動的に出てくる)

投稿2023/01/07 00:49

moriman

総合スコア615

yuma.inaura👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。