Pour les personnes qui connaissent déjà Android:
UI - Android a besoin d'intégration XML alors que tout est un widget en flottement et peut être fabriqué dans un seul fichier
Auditeurs , plus d'auditeurs pour onclicks, appelez les méthodes, modifiez l'état et profitez de la vue
findview - plus findViewByid () - Faites tout simplement à l'intérieur du widget () {} et laissez la recherche sur Android
Gradle - Plus de problèmes de gradle - Ajouter des dépendances dans le fichier pubspe.yaml et actualiser l'application pour utiliser les nouvelles bibliothèques
Actifs - doivent être gérés séparément dans Flutter, vous devez déclarer tout ce que vous utilisez - pour EG: images, polices. Dans Android, vous pouvez simplement l'ajouter dans la section Fichier et les utiliser.
Les animations sont beaucoup plus faciles et bien prises en charge dans Flutter - Utilisations de base - par exemple: activité d'éclaboussure, onglets de balayage, résultats, page d'analyse, navigation
Exécution de l'application - Rechargement chaud dans Flutter - il suffit de frapper «R» pour un rechargement et un «R» pour un redémarrage de l'application. Android Studio peut prendre jusqu'à 20-30 secondes pour chaque rechargement, et encore plus s'il y a des problèmes de gradle, qui apparaissent de temps en temps
API - Les API Android peuvent être réalisées avec différentes bibliothèques comme Retrofit à l'aide de GSON, tandis que la récupération dans Flutter peut être effectuée sans aucune douleur. La fonction de récupération commune peut être utilisée dans Flutter et avoir des méthodes d'attente asynchrones pour appeler les API.
Recycler / List View - Recycler View est utilisé dans Android pour créer différentes listes sur un écran. Nous avons besoin d'un adaptateur pour ce qui a une interface et nous devons connaître toutes sortes de fonctions différentes pour l'implémenter complètement. Flutter a juste un widget pour un ListView où nous pouvons définir différents listtiles ou simplement ajouter des choses dynamiquement. Beaucoup plus facile, semble plus simple.
Courbe d'apprentissage - Travailler dans Flutter est plus facile une fois que vous connaissez Dart, qui est similaire à JavaScript, et comprenez les concepts de base sur les widgets. Android vous permet de faire des dispositions à l'aide du concepteur, qui peuvent être utilisées pour effectuer des dispositions de contraintes. La création d'applications de base est certainement plus facile à apprendre dans Android, mais au fur et à mesure que nous allons plus profondément dans les fragments et autres choses, cela commence à être compliqué
Fragments vs composants (widgets) - Nous pouvons simplement utiliser le composant widget où que nous souhaitions contrairement aux fragments que nous fabriquons dans Android, qui nécessitent des connaissances auparavant sur la façon d'utiliser un bundle, des adaptateurs, des dispositions XML et différentes méthodes comme OnCreatEview et LayoutinFlator
Base de données SQL - C'est assez similaire dans les deux technologies. La seule différence est que la gestion de l'État peut se mettre en place si vous essayez d'ajouter quelque chose de consécutivement, vous devrez stocker la clé de l'état et la modifier en utilisant SetState () {_ Key + = 1} -> Juste un cas d'utilisation. La bibliothèque de salle d'Android est également utilisée et facile à implémenter
Modèles d'architecture - Tout se résume à MVP / MVVM / MVC dans Android, tandis que nous avons un bloc et des fournisseurs dans Flutter, qui font quelque chose de similaire à MVC, séparant la logique métier en créant des éviers et des flux
Éditeur de code - VSCODE / Android Studio - Flutter and Android Studio pour Android
Guide de démarrage - Assez de la main pour Android, téléchargez le studio et commencez, alors que vous devez faire un tas de choses pour Flutter - peut être ennuyeux
Firebase - Ressources pour 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
Connexion Firebase - Certainement plus facile à implémenter pour Flutter, vous pouvez le faire en 20 lignes de code en fonction de la vue de liste que vous faites. Les bases sont les mêmes, vous avez besoin des fichiers .json et devez l'ajouter à la console Firebase. Le codage dans Flutter vous aide à le comprendre d'une bien meilleure manière. Dans l'ensemble, c'est similaire.
Listes + Firebase - Android a des vues de recycleur folles qui rendent tout si difficile, et l'intégration de la vue Firebase + Recycler a environ 200 articles, et vous ne pouvez tout simplement pas le maîtriser. Il n'y avait aucun moyen que j'aurais pu implémenter quelque chose dans Android sans tutoriel, mais en flottement, vous pouvez toujours essayer
Récupérer, pousser les données - Pousser les données est également plus facile dans Flutter Firebase, il existe littéralement une méthode ONTAP () qui vous permet d'envoyer un instantané des données
Apprentissage automatique - Intégration de l'apprentissage automatique
UI - Flutter et RN ont un système de fichiers, où vous définissez les règles et l'interface utilisateur. Personnellement, j'aime l'interface pour les applications Flutter car elle est beaucoup plus définie. Il est également maintenu par Google qui possède Android et peut avoir une bien meilleure intégration avec Google.
Classes - Flutter utilise des widgets pour tout, de TextViews aux TabViews - ils sont appelés «widgets». Flutter utilise Dart, tandis que React Native utilise TypeScript ou JavaScript.
Composants - RN a des composants et nous devons les importer de «React-Native» pour les utiliser. Flutter a des widgets qui peuvent être utilisés dans un espace similaire. Les deux sont similaires à l'exception du style et de la partie de rendu.
Styling Flutter - Widgets à l'intérieur - Donc, si vous voulez un rembourrage => vous enveloppez le widget dans le widget () avec un padding, React Native: vous définissez Style Const: Stylesheet et ajoutez vos styles - similaires au style Web où vous avez CSS. So React Native a le style CSS alors que Flutter a le style «widget»
Animations - Flutter est beaucoup plus facile à grasb, tandis que React Native a un aspect plus large
Courbe d'apprentissage - similaire dans React Native et Flutter.
Bibliothèques - NPM aide à réagir natif alors que pour Flutter, nous les ajoutons simplement au fichier pubspe.yaml
API - Les deux ont une vision claire de l'utilisation d'API. Un bon article pour RN - https://medium.com/better-programming/handling-api-like-a-boss-in-react-native-364abd92dc3d
Éditeur de code - VS Code est populaire pour les deux
En démarrage - Personnellement, il a été vraiment difficile de travailler avec React Native sur Windows. C'est beaucoup mieux si vous utilisez un Mac, mais dans l'ensemble, cet écran rouge vous ennuye beaucoup. Flutter n'a pas le guide de démarrage le plus simple, mais il y a du soutien pour vous aider.
Dans l'ensemble - les deux peuvent fabriquer des applications natives croisées et je choisirai Flutter Anyday - Hackathons / Projets rapides / Apprenez également Android, et React Native - Web / Learn React.js / -> Si vous souhaitez vous insister: 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 à un bouton, TextView, etc. dans Android pour les voix de voix https://steemit.com/utopian-io/@tensor/advanced-flutter-project---Best-Practices---Generic-loc-Providers---Part-Three
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,);