Für Leute, die Android bereits kennen:
UI - Android braucht XML -Integration, während alles ein Widget in Flattern ist und in einer einzelnen Datei hergestellt werden kann
Zuhörer keine Hörer mehr für Onclicks, rufen Sie die Methoden an, ändern Sie den Zustand und genießen Sie die Aussicht
findView - Keine findViewById () - Mach einfach alles im Widget () {} und überlasse das Befund Android
Gradle - keine Abschlussprobleme mehr - Fügen Sie Abhängigkeiten in die Datei pubSpec.yaml hinzu und aktualisieren Sie die Anwendung, um die neuen Bibliotheken zu verwenden
Vermögenswerte - müssen in Flattern getrennt verwaltet werden. Sie müssen alles deklarieren, was Sie verwenden - für z. B. Bilder, Schriftarten. In Android können Sie es einfach in den Dateiabschnitt hinzufügen und verwenden.
Animationen sind viel einfacher und gut unterstützt in Flutter - Basic -Verwendungen - z.
Ausführen der App - heißes Nachladen in Flutter - Drücken Sie einfach 'r' für ein Reload und 'R' für einen Neustart der Anwendung. Android Studio kann für jedes Nachladen bis zu 20-30 Sekunden dauern, und noch mehr, wenn es Gradle-Probleme gibt, die von Zeit zu Zeit popupieren
API - Android -APIs können mit verschiedenen Bibliotheken wie Nachrüst mit GSON durchgeführt werden, während ein Flattern ohne Schmerzen durchgeführt werden kann. Die gemeinsame Abruffunktion kann in Flutter verwendet werden und haben Async -auf Methoden, um die APIs aufzurufen.
Recycler/List -Ansicht - In Android wird die Recycler -Ansicht verwendet, um verschiedene Listen auf einem Bildschirm zu erstellen. Wir brauchen einen Adapter für das, das eine Schnittstelle hat, und wir müssen alle möglichen verschiedenen Funktionen kennen, um sie vollständig zu implementieren. Flutter hat nur ein Widget für eine ListView, in der wir verschiedene Listentile definieren oder einfach dynamisch Dinge hinzufügen können. Viel einfacher sieht einfacher aus.
Lernkurve - Das Arbeiten in Flutter ist einfacher, wenn Sie Dart kennen, das JavaScript ähnelt, und die grundlegenden Konzepte über Widgets zu verstehen. Mit Android können Sie mit Hilfe des Designers Layouts erstellen, mit denen Sie Einschränkungen durchführen können. Grundlegende Anwendungen sind definitiv leichter in Android zu lernen, aber wenn wir in Fragmenten und anderen Dingen tiefer gehen, wird es kompliziert, dass es kompliziert wird
Fragmente vs -Komponenten (Widgets) - Wir können die Widget -Komponente, wo immer wir wollen, einfach verwenden, im Gegensatz zu den Fragmenten, die wir in Android erstellen, für die ein gewisses Kenntnis
SQL -Datenbank - In beiden Technologien ist sie ziemlich ähnlich. Der einzige Unterschied besteht darin, dass das staatliche Management in Einklang gebracht werden kann, wenn Sie versuchen, nacheinander etwas hinzuzufügen. Die Raumbibliothek in Android ist ziemlich weit verbreitet und auch einfach zu implementieren
Architekturmuster - Alles läuft auf MVP/ MVVM/ MVC in Android an
Code -Editor - VSCODE/Android Studio - Flutter und Android Studio für Android
Erste Schritte Guide - Ziemlich Straighforward für Android, laden Sie das Studio herunter und beginnen Sie mit dem Start, während Sie ein paar Dinge für Flattern tun müssen - kann ärgerlich sein
Firebase - Ressourcen für Flutter 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 Connection - Auf jeden Fall einfacher für Flutter zu implementieren, können Sie dies in 20 Codezeilen tun, die von der von Ihnen erstellten Listenansicht. Die Grundlagen sind gleich, Sie benötigen die .json -Dateien und müssen sie zur Firebase -Konsole hinzufügen. Das Codieren in Flattern hilft Ihnen, es viel besser zu verstehen. Insgesamt ist es ähnlich.
Listen + Firebase - Android hat verrückte Recycler -Ansichten, die alles so schwer machen, und die Integration von Firebase + Recycler -Ansicht hat ungefähr 200 Artikel, und Sie können es einfach nicht beherrschen. Ich hätte auf keinen Fall etwas in Android ohne Tutorial implementieren können, aber in Flattern können Sie es immer versuchen können
Abrufen, Datenschieben - Das Schieben von Daten ist auch in Flutter Firebase einfacher. Es gibt buchstäblich eine ONTAP () -Methode, mit der Sie einen Snapshot der Daten senden können
Maschinelles Lernen - Integration des maschinellen Lernens
UI - Flattern und RN haben ein ein Dateisystem, in dem Sie die Regeln und die Benutzeroberfläche definieren. Ich persönlich mag die Schnittstelle für Flutter -Apps, da sie viel definierter ist. Es wird auch von Google gepflegt, dem Android gehört und eine viel bessere Integration in Google haben kann.
Klassen - Flutter verwendet Widgets für buchstäblich alles, von Textviews bis TabViews - sie werden als "Widgets" bezeichnet. Flutter verwendet DART, während React Native TypeScript oder JavaScript verwendet.
Komponenten - RN verfügt über Komponenten und wir müssen sie aus "React -Native" importieren, um sie zu verwenden. Flutter hat Widgets, die in einem ähnlichen Raum verwendet werden können. Beide sind ähnlich, außer dem Styling und dem Rendering -Teil.
Styling Flutter - Inside Widgets - Wenn Sie also padding => Sie das Widget in Padding () Widget mit etwas Polsterung einwickeln möchten, reagieren Sie nativ: Sie definieren const style: stylesheet und fügen dort Ihre Stile hinzu - ähnlich dem Webstil, in dem Sie CSS haben. React Native hat ein CSS -Styling, während Flutter das "Widget" -Styling hat
Animationen - Flutter ist viel einfacher zu Grasb, während React Native einen größeren Aspekt hat
Lernkurve - ähnlich in React Native und Flattern.
Bibliotheken - NPM hilft bei React Native, während wir für Flattern sie einfach zur publepec.yaml -Datei hinzufügen
APIs - beide haben eine klare Sicht bei der Verwendung von APIs. Ein guter Artikel für RN-https://medium.com/betterprogramming/handling-api-like-a-boss-in-react-native-364abd92dc3d
Code -Editor - VS Code ist für beide beliebt
Erste Schritte - Persönlich war es wirklich sehr schwierig, mit React Native unter Windows zu arbeiten. Es ist viel besser, wenn Sie einen Mac verwenden, aber insgesamt nervt der rote Bildschirm Sie sehr. Flutter hat nicht den einfachsten Anleitung für den Einstieg, aber es gibt Unterstützung, die Ihnen helfen.
Insgesamt - beide können Cross Native Apps erstellen und ich werde jeden Tag Flutter wählen - Hackathons/ schnelle Projekte/ Lernen Sie auch Android und reagieren Sie nativ - Web/ Learn React.js/ -> Wenn Sie sich selbst betonen möchten: 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 hinzufügen https://steemit.com/utopian-io/@tensor/advanced-flutter-project--Best-Practices-Generic-bloc-Providers--Part-Thee
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,);