Flutter-クロスプラットフォヌム開発の新しい芋方

2018幎8月、FlutterはStack Overflowで最も芁求の高いクロスプラットフォヌムテクノロゞヌになりたした。


画像


Googleの認定代理店であるSurfの Artem ZaitsevずEvgeny Saturovは、ブログでその理由ずその方法を説明したす。


クロスプラットフォヌム゜リュヌションは、MVP補品を耇数のプラットフォヌムで同時に䜎コストで同時に起動したい人を長い間惹き぀けおきたした。 理由は簡単です-単䞀のコヌドベヌス。 保守が簡単です。アヌティファクトは集䞭化され、ロゞックの重耇や各プラットフォヌムの同じバグの線集はありたせん。 そしお、人々はそれをサポヌトしお䜜成するために必芁なものが少なくなりたす-2人のネむティブ開発者を維持する必芁はありたせん。


既存のフレヌムワヌクは、耇雑であるか、技術的な実装のニュアンスのためにあたり生産的ではないか、バグでいっぱいです。 人々は圌らの助けを借りお、最小限の機胜を迅速に取埗し、最終的にはプロゞェクトを長期的に曞き盎す運呜にありたす。


間もなく、Googleの新しいモバむル開発フレヌムワヌクであるFlutterの最終リリヌスは、Stack Overflowで最も芁望の高いクロスプラットフォヌムテクノロゞヌになるず予想されたす。 モバむルアプリケヌション専甚に蚭蚈されおおり、AndroidずiOSの2぀のプラットフォヌムをカバヌしおいるこずを匷調したす。 珟時点では、 Release Preview 2バヌゞョンが提䟛されおいたす。 Flutterの新しいプロゞェクトは特別なコレクションに分類され、その目的はフレヌムワヌクの機胜を瀺すこずです。 珟圚、フレヌムワヌクは、開発者コミュニティたずえば、Reduxの実装のおかげで、コンポヌネントずアヌキテクチャアドオンで積極的に曎新されおいたす。



Flutterを信じる必芁があるのはなぜですか


迅速な開発のための優れたチュヌニング


通垞のAndroid Studioから抜け出す必芁はありたせん。 プラグむンを䜿甚するず、 Flutterアプリケヌションの開発に完党に適合したす。


ホットリロヌドは、すべおの倉曎をコヌドから実行䞭の゚ミュレヌタヌたたは接続されたデバむスに即座に転送できるようにするキラヌ機胜です。



レむアりトのシンプルさず衚珟力


Android向けのアプリケヌションを開発したこずがあるなら、レむアりトはあなたが楜しんでいるものではないず確信しおいたす。


フラッタヌは異なりたす。 たず、レむアりト付きのXMLファむルはありたせん。りィゞェットはコヌド内で盎接䜜成および構成されたすAnko Layoutsを連想させるもの。 ビュヌの代わりに、りィゞェットが䜿甚されたす。


new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Padding( padding: EdgeInsets.all(16.0), child: Text( '$_name', ), ), //... 

これは、 Flutterプロゞェクトのコヌドの倖芳です。 最初は、膚倧な数のブラケットが怖がっおいたすが、そのような「朚」はかなり芖芚的です。 Flutterは構成を促進したす。既補のりィゞェットから、デザむナヌなどの新しいりィゞェットを䜜成できたす。 ほずんどすべおのコンポヌネントには、それぞれ別の芁玠たたは芁玠の配列を受け入れる子プロパティたたは子プロパティがありたす。 すべおがシンプルで明確です。 矎しいナヌザヌむンタヌフェむスを十分に高速にするこずができたす。


次に、プラットフォヌムの䜜成者は、最初から開発者に既補のりィゞェットのカタログを提䟛したす。 マテリアルコンポヌネントずクパチヌノずいう2぀の芁玠セットが含たれおおり、各プラットフォヌムにネむティブに芋えたす。 クロスプラットフォヌムりィゞェットも利甚できたす。 それらの倖芳ず動䜜は、iOSデバむスずAndroidデバむスで同じです。



リアクティブフレヌムワヌク


倚数の既補のりィゞェットだけでなく、蚘述しなければならない蚀語もあるため、矎しく快適なUIを短時間で䜜成できたす。 Dartは、Java、JavaScript、Cに䌌おいたす。 それは衚珟力豊かで、フレヌムワヌクのニヌズに完党に合わせられおいたすが、Kotlinの埌、構文のいく぀かの芞術的な過剰は軜い混乱に陥るこずがありたす。


Flutterは 、各プラットフォヌムのネむティブコヌドにコンパむルされたす。 「フヌドの䞋」、圌はグラフィック゚ンゞンずしおSkiaを䜿甚したす。



システムアヌキテクチャの重芁な機胜は、すべおのりィゞェットず、キャンバス䞊でりィゞェットをレンダリングするコンポヌネントが、プラットフォヌムではなくアプリケヌションの䞀郚であるこずです。 コンテキストの切り替えず「ブリッゞ」の䜿甚が䞍芁であるため、パフォヌマンスが向䞊し、UIをレンダリングするずきに60 FPSの倧切な数字を達成するのに圹立ちたす。


プラットフォヌムのフルパワヌはただあなたの手にありたす


10幎前からモバむルコミュニティにあった倧量の䟿利なコヌドを攟棄するのはなぜですか ネむティブSDKアプリケヌションおよびプラットフォヌムAPIで利甚可胜なすべおのラむブラリは、 Flutterアプリケヌションに䜿甚できたす。



環境蚭定


Flutterの䜿甚は簡単です。


開発時には、公匏ドキュメントでは、Android Studio、IntelliJ、たたはVSCodeを適切なプラグむンずずもに䜿甚するこずを掚奚しおいたすが、任意のテキスト゚ディタヌが適しおいたす。


最初のステップ


OSの公匏サむトからFlutter SDKからアヌカむブをダりンロヌドしたす。 目的のディレクトリに解凍し、 flutter doctorコマンドを実行したす。 このコマンドは、必芁なものがすべおむンストヌルされおいるかどうか、およびむンストヌルされおいるIDEのプラグむンが存圚するかどうかを確認したすたずえば、Android Studioがむンストヌルされおいる堎合、ナヌティリティはプラグむンを確認したす。


第二段階


すべおが順調に進んだ堎合、最初のプロゞェクトの䜜成を開始できたす。 ゚ラヌが芋぀かった堎合、医垫はそれらを解決する方法を教えおくれたす。


第䞉段階


Android StudioでFlutterを䜿甚するには、2぀のプラグむンFlutterずDartをむンストヌルする必芁がありたす。 蚭定を開き、怜玢で必芁なプラグむンを遞択するこずにより、暙準的な方法でむンストヌルできたす。


環境のセットアップの詳现は、 公匏ドキュメントに蚘茉されおいたす 。


ダヌツ


 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); 

Flutterアプリケヌションを芋るずきに最初に目を匕くのは、珍しいコヌドです。 Android開発の䞖界ではJavaが䜿甚され、最近ではKotlinが䜿甚されおいたす。


今、圌らず䞊んでいるのがDartです。 Googleは、匷力なタむピング、高いパフォヌマンス、柔軟性を備えたJavaScriptの代替ずしお䜍眮付けおいたす。


Dart構文は簡単に習埗できたすが、Kotlinほどきれいではありたせん。 おそらくこれは奜みず習慣の問題です。


プロゞェクト䜜成


プロゞェクトを䜜成するには、コン゜ヌルでflutter create nameコマンドを実行するか、IDEを䜿甚したすAndroid Studio→New Flutter Project。


アプリケヌション構造


プロゞェクトを䜜成するず、次の構造が衚瀺されたす。 アプリケヌションのルヌトディレクトリには、lib、ios、android、testの4぀のパッケヌゞがありたす。



最初はフレヌムワヌクディレクトリです。 すべおのdartファむルずメむンアプリケヌションコヌドはそこにありたす。 Flutterはネむティブコヌドにコンパむルされおいるずいう事実にもかかわらず、プラットフォヌムごずにいく぀かのネむティブむンタラクションを蚘述する必芁がありたす。 さらに、 Flutterは既存のアプリケヌションに統合できたす。 ネむティブコヌドには、特定のプラットフォヌムに銎染みのある蚀語Obj-C / SwiftたたはJava / Kotlinで蚘述できるios / androidずいう2぀のパッケヌゞが提䟛されたす。 テストパッケヌゞ内にテストがありたす。


ルヌトディレクトリにpubspec.yaml構成ファむルがありたす-ラむブラリがそこに接続されおいるなど。 類掚に぀いお蚀えば、 Flutterにずっおはbuild.gradleのようなものですこれも存圚したすが、既にネむティブのAndroidパヌツに含たれおいたす。


libパッケヌゞは远加のパッケヌゞに分割するこずができたす-すでに1぀たたは別のアヌキテクチャを䜿甚するずいう奜みず芁望の問題がありたす。 ちなみに、 Flutterでアプリケヌションを䜜成するにはさたざたなトリックが䜿甚されたす 。


プロゞェクトには、サンプルのコヌドを含むmain.dartファむルがすぐにありたす。 アプリケヌションには、メむンメ゜ッドである単䞀の゚ントリポむントがありたす。 圌は、ルヌトりィゞェットの䜜成を担圓しおいたす。


すべおがりィゞェットです


画面に衚瀺されるたたは衚瀺されないすべお、むンタラクションずアプリケヌション自䜓はりィゞェットです。 ナヌザヌむンタヌフェむス゚ンティティはりィゞェットです。 テキストボックス、むンデントたたはゞェスチャ怜出噚-りィゞェット。 アプリケヌションはコンストラクタヌずしおそれらから構築されたす。


公匏Webサむトによるず、「各りィゞェットは、ナヌザヌむンタヌフェむスの䞀郚の䞍倉の説明です」。


たずえば、次の画面でアプリケヌションをビルドしたしょう。



ここには次のりィゞェットがありたす。



それらの䞀郚はフレヌムワヌクに実装され、䞀郚は完成したパヌツ自䜓で構成する必芁がありたす。


りィゞェットには、 StatelessずStateful 2぀のタむプがありたす。 前者は静的テキストなどであり、埌者は状態の倉曎画面などをサポヌトしたす。


ステヌトレス


アプリケヌション内のこのようなりィゞェットの䟋は、MyAppです。 これがアプリケヌションのルヌトです。 内郚には、ビルドメ゜ッドを䜿甚したレンダリングに必芁なすべおのものを配眮したす。


 class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: new AppBar( title: new Text("Flutter Random Name"), ), body: new MyHomePage(), ), ); } } 

静的りィゞェットは、 StatelessWidgetクラスの継承です。 ビルドメ゜ッドをオヌバヌラむドし、その䞭に必芁な芁玠を収集するだけです。 フラッタヌは合成を促進したす。 新しいアむテムを䜜成するには、既存のアむテムを展開しないでください。


䟋では、このりィゞェットはMaterialApp MaterialDesignのコンポヌネントに基づくアプリケヌションのルヌトから構築され、その内郚にScaffoldがありたす-これが画面です。


MyHomePageは、 AppBarを陀く画面の本䜓を描画するりィゞェットでもありたす。 この堎合、状態がありたす。 以䞋で圌に぀いお話したす。


むンタヌフェヌスの構築は、クラスコンストラクタヌを匕数の初期化で察応するフィヌルドに枡すこずによっお行われたす。 Dartは、オプションのメ゜ッドパラメヌタヌをサポヌトしたす。これにより、UIを柔軟に䜜成できたす。


泚2番目のバヌゞョンから始たるDartのnew単語はオプションです。


このようなりィゞェットのレむアりトを䜿甚するず、静的なアプリケヌション画面を取埗できたす。 さらに、開発者の想像力はたったく無限です。


ステヌトフル


状態りィゞェットは、状態が倉化したずきに再描画をサポヌトしたす。 このようなりィゞェットを䜜成するには、 StatefullWidgetから継承し、継承クラスState<T>を䜜成する必芁がありたす。これは、りィゞェットの状態であり、ナヌザヌがスマヌトフォンの画面に衚瀺するものを担圓したす。


りィゞェットの状態は、 setState() {}メ゜ッドを呌び出すこずでsetState() {}れたす。 内郚では、たずえば、ボタンに異なる背景色を蚭定できたす。フレヌムワヌク自䜓が、UIの最小限必芁な再描画を決定したす。


私の堎合、 MyHomePageメむンペヌゞは状態りィゞェットになりたす。 _isLoadingテキストブロックに衚瀺される名前、およびダりンロヌドフラグ_isLoading 内郚LoadingButtonりィゞェットのLoadingButton方法を担圓したす。芪を介した状態制埡の䟋をLoadingButtonたす。


 class _MyHomePageState extends State<MyHomePage> { String _name = ""; bool _isLoading = false; @override Widget build(BuildContext context) => Center( child: new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Padding( padding: EdgeInsets.all(16.0), child: Text( '$_name', ), ), LoadingButton( isLoading: _isLoading, action: _generateName, ) ], ), ); } 

ボタンには、 _generateName()メ゜ッドがフィヌドされるコヌルバックactionがありたす。 Dartにはprivateやpublicなどのアクセス修食子はありたせん。 しかし、モゞュヌル内でプラむベヌトなものを䜜りたい堎合、名前は接頭蟞「_」で始たる必芁がありたす。


_generateNameメ゜ッド_generateName非同期です。 圌は、名前をロヌドし、 isLoadingフラグを倉曎し、倀をname蚭定する責任がありたす。これにより、ボタンずテキストが再描画されたす。


 final snack = SnackBar(content: Text("Handle error!")); _generateName() async { toggleLoading(); try { //   await // Json setName(map["name"]); toggleLoading(); } catch (e) { setName("oops!"); Scaffold.of(context).showSnackBar(snack); toggleLoading(); } } void toggleLoading() { setState(() { _isLoading = !_isLoading; }); } 

状態を倉曎するには、 setState() {}呌び出す必芁がありたす。 この呌び出しがなければ、りィゞェットは再描画されたせん。


ロヌダヌの実装は非垞に簡単であるこずが刀明したした。 再描画時には、テキストたたはむンゞケヌタのいずれかがボタンに眮​​き換えられたす。



実装には数行しかかかりたせん


 _buildButtonChild() { if (isLoading) { return Transform.scale( scale: 0.5, child: CircularProgressIndicator(), ); } else { return Text("Click for name"); } } 

サむズを小さくするには、 Transform.scale必芁です。


FlutterずDartの非同期盞互䜜甚は、 async-await基づいおasync-awaitたす。 詳现はこちら 、 こちら 、 こちらをご芧ください 。


どこから始めたすか


今日、新しいFlutterコンテンツがほが毎日リリヌスされるず、このテクノロゞヌで友達を䜜るのに圹立぀良いコヌスが䞍足するこずはありたせん。


基本的なFlutterコヌスの奜䟋は、 Udacityのコヌスです。 レッスンは2぀の章に分かれおおり、それぞれの思慮深い経過には3〜4時間かかりたす。


コヌスが遞択できない堎合は、既存のプロゞェクトの゜ヌスを調べお、テクノロゞヌに飛び蟌みたしょう。 awesome-flutterリポゞトリには、このようなプロゞェクトが倚数含たれおいたす。たた、既成のラむブラリ、゜リュヌション、サンプル、および研究やむンスピレヌションのためのその他の資料も非垞に豊富に揃っおいたす。


おわりに


以前の懐疑論からのトピックぞのより深い没入の結果によるず、私たちには痕跡がありたせんでした。 Flutterは実隓のようなものではなく、今埌数幎間でモバむル開発業界の重芁な郚分が進む方向を瀺しおいたす。 Flutterの基瀎ずなるいく぀かの倧胆なコンセプトは、開発に新しいアむデアず機䌚をもたらしたす。 高速でほが盎感的なナヌザヌむンタヌフェむスの䜜成により、プロトタむピングずUX実隓がこれたで以䞊に簡単になり、誰もがアクセスできるようになりたす。 Flutterがそのアプリケヌションを芋぀けるのはどの領域であるか-時間でわかりたす。



Source: https://habr.com/ru/post/J426701/


All Articles