すでにAndroidを知っている人のために:
UI -AndroidにはXML統合が必要ですが、すべてがフラッターのウィジェットであり、単一のファイルで作成できます
リスナーオンクリックのリスナー、メソッドを呼び出し、状態を変更して、ビューを楽しむ
FindView -No More FindViewById() - Widget(){}内ですべてを実行して、Androidにその結果を残してください
Gradle-これ以上Gradleの問題はありません-PubSpec.yamlファイルに依存関係を追加し、アプリケーションを更新して新しいライブラリを使用します
資産- Flutterで個別に管理する必要があります。使用するすべてを宣言する必要があります。たとえば、画像、フォントについて。 Androidでは、ファイルセクションに追加して使用できます。
アニメーションははるかに簡単で、フラッターでよくサポートされています - 基本的な用途 - スプラッシュアクティビティ、スワイプタブ、結果、分析ページ、ナビゲーション
アプリを実行する- Flutterでホットリロード - リロードのために「R」を押し、アプリケーションを再起動するために「R」を押します。 Android Studioは、リロードごとに最大20〜30秒かかることがあります。
API -Android APIは、GSONを使用したレトロフィットなどのさまざまなライブラリで実行できますが、Flutterでのフェッチは痛みなく行うことができます。一般的なフェッチ関数は、フラッターで使用でき、ASYNCがAPIを呼び出す方法を待っています。
リサイクル/リストビュー- リサイクルビューはAndroidで使用され、画面にさまざまなリストを作成します。インターフェイスを備えたアダプターが必要であり、完全に実装するには、あらゆる種類の異なる機能を知る必要があります。 Flutterには、ListView用のウィジェットがあり、さまざまなListTilesを定義したり、動的に物を追加したりできます。はるかに簡単で、シンプルに見えます。
学習曲線- JavaScriptに似たDARTを知ると、フラッターでの作業は簡単で、ウィジェットに関する基本概念を理解します。 Androidを使用すると、デザイナーの助けを借りてレイアウトを作成できます。これは、制約レイアウトを作成するために使用できます。基本的なアプリケーションを作成することは間違いなくAndroidで学習しやすくなりますが、フラグメントや他のものが深くなると、複雑になり始めます
フラグメントvsコンポーネント(ウィジェット) - Androidで作成したフラグメントとは異なり、WindwherewherewhereでWidgetコンポーネントを使用することができます。
SQLデータベース- 両方のテクノロジーでかなり似ています。唯一の違いは、連続して何かを追加しようとしている場合、州の管理が整ってくる可能性があることです。州にキーを保存し、setState(){_ key+= 1} - >単なるユースケースを使用して変更する必要があります。 Androidの部屋図書館は非常に幅が広く、実装も簡単です
アーキテクチャパターン- すべてがAndroidのMVP/ MVVM/ MVCに要約されますが、Flutterのブロックとプロバイダーがあります。これはMVCに似た何かを行い、シンクとストリームを作成することでビジネスロジックを分離します
コードエディター-VSCODE/ANDROID STUDIO-Android用のフラッターおよびAndroidスタジオ
Getting Guide -AndroidのためにかなりStraighforward、スタジオをダウンロードして始めましょう。
FireBase-フラッターファイアベースのリソース: -
https://firebase.google.com/docs/flutter/setup
https://flutter.dev/docs/development/data-and-backend/firebase
https://www.youtube.com/watch?v=8m-fa239hy4
https://www.youtube.com/channel/ucftm1fgjzskospdzgtbp7ha/search?query=firebase
https://codelabs.developers.google.com/codelabs/flutter-firebase/#0
FireBase接続- Flutterのためには間違いなく実装しやすく、作成するリストビューに応じて20行のコードで実行できます。基本は同じです。.JSONファイルが必要で、FireBaseコンソールに追加する必要があります。フラッターでのコーディングは、それをはるかに良い方法で理解するのに役立ちます。全体的に似ています。
Lists + Firebase -Androidには、すべてを難しくするクレイジーなリサイクルビューがあり、Firebase + Recycler Viewの統合には約200の記事があり、マスターできません。チュートリアルなしでAndroidに何かを実装する方法はありませんでしたが、Flutterでは、いつでも試すことができます
フェッチの取得、データのプッシュ- ファイアーファイアーベースでもデータのプッシュが簡単です。文字通り、データのスナップショットを送信できるONTAP()メソッドがあります。
機械学習- 機械学習の統合
UI-フラッターとRNには、ルールとUIを定義する1つのファイルシステムがあります。 Flutterアプリのインターフェイスは、はるかに定義されているので、個人的には気に入っています。また、Androidを所有しており、Googleとはるかに優れた統合を行うことができるGoogleが維持しています。
クラス-Flutterは、TextViewsからTabviewsまで、文字通りすべてのウィジェットを使用します - それらは「ウィジェット」と呼ばれます。 FlutterはDARTを使用しますが、React NativeはTypeScriptまたはJavaScriptを使用します。
コンポーネント-RNにはコンポーネントがあり、それらを使用するには「React -Native」からインポートする必要があります。 Flutterには、同様のスペースで使用できるウィジェットがあります。どちらもスタイリングとレンダリング部分を除いて似ています。
スタイリングフラッター - 内部ウィジェット - パディングが必要な場合=>パディング()ウィジェットをパディングでラップします。そのため、React NativeにはCSSスタイリングがありますが、Flutterには「ウィジェット」スタイリングがあります
アニメーション- フラッターはグラスブよりもはるかに簡単ですが、反応ネイティブはそれに対してより広い側面を持っています
学習曲線- 反応ネイティブとフラッターが似ています。
ライブラリ-NPMはネイティブの反応に役立ちますが、フラッターの場合はpubspec.yamlファイルに追加するだけです
API-どちらもAPIを使用するという明確なビジョンを持っています。 rn-https://medium.com/better-promgraming/handling-api-a-boss-in-rect-native-364abd92dc3dの良い記事
コードエディター-vsコードは両方に人気があります
始めましょう- 個人的には、WindowsのNative Nativeで作業するのは本当に大変でした。 Macを使用する方がはるかに優れていますが、全体的にその赤い画面はあなたをたくさんいらいらさせます。フラッターには最も簡単な開始ガイドがありませんが、あなたを助けるためのサポートがあります。
全体的に- 両方ともクロスネイティブアプリを作成できます。私はいつでもフラッターを選択します - ハッカソン/クイックプロジェクト/学習Androidも、ネイティブ-Web/ Learn React.js/ - >あなた自身を強調したい場合:P



fetch () async {
var url = "API-HERE" ;
var res = await http. get (url);
var body = jsonDecode (res.body);
// body is your API body
}content descriptionなどを追加できますhttps://steemit.com/utopian-io/@tensor/advanced-flutter-project--ベストプラクティス - generic-bloc-providers--パート3
class App extends StatelessWidget {
@override
Widget build ( BuildContext context) {
// TODO: implement build
return MaterialApp (
home : Home (),
theme : ThemeData (primaryColor : PrimaryColor ), //add-your-color here || or remove this
debugShowCheckedModeBanner : false ,
);
}
}
class Home extends StatefulWidget {
@override
State < StatefulWidget > createState () {
// TODO: implement createState
return new _HomeState ();
}
}
class _HomeState extends State < Home >{
@override
Widget build ( BuildContext context) {
return Scaffold (
body : Column ()
);
}child : users.length <= 0
? Center (
child : EmptyState (
title : 'Oops' ,
message : 'Add form by tapping add button below' ,
),
)
: ListView . builder (
addAutomaticKeepAlives : true ,
itemCount : users.length,
itemBuilder : (_, i) => users[i],
),
) fetch () async {
var url = "API-HERE" ;
var res = await http. get (url);
var body = jsonDecode (res.body);
// body is your API body
} for ( int i = 0 ;i < body[ 0 ][ 'staggered_tiles' ].length;i ++ ){
_staggeredTiles. add ( new StaggeredTile . count (
body[ 0 ][ 'staggered_tiles' ][i][ 'cross_axis' ], // body is what we get from the API
body[ 0 ][ 'staggered_tiles' ][i][ 'main_axis' ] // body is what we get from the API
));
}
if (body[i][ 0 ][ 'type' ] == 'donut' ) {
List < LabelPieSales > _d = [];
for ( int j = 0 ; j < body[i][ 0 ][ 'data' ].length; j ++ ) {
_d. add ( new LabelPieSales (
body[i][ 0 ][ 'data' ][j][ 'year' ], body[i][ 0 ][ 'data' ][j][ 'sales' ])); // body is what we get from the API
}
_wid_top. add ( new Container (
height : 200 ,
width : 200 ,
child : DonutChartWidget . withSampleData (_d),
));
}
else if (body[i][ 0 ][ 'type' ] == 'label-pie' ) {
List < LabelPieSales > _d = [];
for ( int j = 0 ; j < body[i][ 0 ][ 'data' ].length; j ++ ) {
_d. add ( new LabelPieSales (
body[i][ 0 ][ 'data' ][j][ 'year' ], body[i][ 0 ][ 'data' ][j][ 'sales' ])); // body is what we get from the API
}
_wid_top. add ( new Container (
height : 200 ,
width : 200 ,
child : SimpleBarChart . withSampleData (_d),
));
} return Container (
padding : const EdgeInsets . all ( 4.0 ),
child : appState.isFetching
? CircularProgressIndicator ()
: appState. getResponseJson () != null
? ListView . builder (
primary : false ,
shrinkWrap : true ,
itemCount : appState. getResponseJson ().length,
itemBuilder : (context, index) {
return Container (
height : 100 ,
width : 100 ,
child : graph (appState. getResponseJson ()),
);
},
)
: Text ( "Press Button above to fetch data" ),
); initDB () async {
return await openDatabase (
join ( await getDatabasesPath (), 'graphs_database.db' ),
onCreate : (db, version) {
return db. execute (
"CREATE TABLE graphs(id INTEGER PRIMARY KEY, type TEXT)" ,
);
},
version : 1 ,
);
}floatingActionButton : FloatingActionButton (
child : Icon ( Icons .add),
onPressed : () async {
Dog dog = new Dog (id : _id, name : "name" ,age : 22 );
await insertDog (dog);
setState (() {
_id += 1 ;
});
},
), List < Graph > graphs_sql = await graphs ();
List < String > graphs_sql_types = [];
for ( int i = 0 ;i < graphs_sql.length;i ++ ){
graphs_sql_types. add (graphs_sql[i].type);
}
if (graphs_sql.length != _types.length) {
for ( int i = 0 ; i < _types.length; i ++ ) {
if ( ! graphs_sql_types. contains (_types[i])){ // add only if a new type
await insertGraph ( new Graph (id : i, type : _types[i]));
}
}
} launchUrl () {
setState (() {
urlString = controller.text;
flutterWebviewPlugin. reloadUrl (urlString);
});
} class News {
String dateAdded;
String title;
String body;
String level;
String category;
News ( this .dateAdded, this .title, this .body, this .level, this .category);
}
class Record {
final String name;
final int votes;
final DocumentReference reference;
Record . fromMap ( Map < String , dynamic > map, { this .reference})
: assert (map[ 'name' ] != null ),
assert (map[ 'votes' ] != null ),
name = map[ 'name' ],
votes = map[ 'votes' ];
Record . fromSnapshot ( DocumentSnapshot snapshot)
: this . fromMap (snapshot.data, reference : snapshot.reference);
@override
String toString () => "Record<$ name :$ votes >" ;
} double _height = MediaQuery . of (context).size.height;
double _width = MediaQuery . of (context).size.width; @override
void initState () {
// TODO: implement initState
super . initState ();
_image = {url};
localList1 = globalList1;
localList1 = globalList2;
} export const sendToTopic = functions.firestore
.document( 'recipes/{recipyId}' )
.onCreate(async snapshot => {
// const recipe = snapshot.data();
const payload : admin.messaging.MessagingPayload = {
notification: {
title: 'new recipe added, check it out' ,
body: 'Make it and eat it'
}
};
return fcm. sendToTopic ( 'recipes' , payload);
}); @override
Widget build ( BuildContext context) {
return Scaffold (
appBar : AppBar (title : Text ( 'Recipes for you' )),
body : _buildBody (context),
);
}
Widget _buildBody ( BuildContext context) {
return StreamBuilder < QuerySnapshot >(
stream : Firestore .instance. collection ( 'recipes' ). snapshots (),
builder : (context, snapshot) {
if ( ! snapshot.hasData) return LinearProgressIndicator ();
return _buildList (context, snapshot.data.documents);
},
);
} List<Recipe> recipe_list = [];
// snapshot.map((data) => recipeList(context, data).toList());
for(int i=0;i<snapshot.length;i++){
Recipe recipe = Recipe.fromSnapshot(snapshot[i]);
recipe_list.add(recipe);
}
return AsymmetricView(products: recipe_list,);