Para las personas que ya conocen Android:
UI - Android necesita integración XML, mientras que todo es un widget en Flutter y se puede hacer en un solo archivo
Oyentes No más oyentes para OnClicks, llamen a los métodos, cambian el estado y disfrutan de la vista
findView - No más findViewById () - Simplemente haga todo dentro del widget () {} y deje el hallazgo en Android
Gradle - No más problemas de graduación: agregue dependencias en el archivo pubspec.yaml y actualice la aplicación para usar las nuevas bibliotecas
Activos : deben administrarse por separado en Flutter, debe declarar todo lo que usa, por ejemplo: imágenes, fuentes. En Android, simplemente puede agregarlo en la sección del archivo y usarlos.
Las animaciones son mucho mucho más fáciles y compatibles en Flutter - Usos básicos - Ej.
Ejecutando la aplicación , recarga en caliente en Flutter, solo presione 'R' para una recarga y 'R' para un reinicio de la aplicación. Android Studio puede tomar hasta 20-30 segundos para cada recarga, y aún más si hay problemas de graduación, que aparecen de vez en cuando
API : las API de Android se pueden hacer con diferentes bibliotecas como la modernización que usa GSON, mientras que la obtención de la recuperación de Flutter se puede hacer sin ningún dolor. La función de búsqueda común se puede utilizar en Flutter y hacer que Async espere métodos para llamar a las API.
Vista de reciclador/lista : la vista Recicladora se usa en Android para crear diferentes listas en una pantalla. Necesitamos un adaptador para lo que tiene una interfaz y necesitamos conocer todo tipo de funciones diferentes para implementarlo por completo. Flutter solo tiene un widget para una vista de ListView donde podemos definir diferentes títulos de lista o simplemente agregar cosas dinámicamente. Mucho más fácil, se ve más simple.
Curva de aprendizaje : trabajar en Flutter es más fácil una vez que conoce a DART, que es similar a JavaScript, y comprende los conceptos básicos sobre los widgets. Android le permite hacer diseños con la ayuda del diseñador, que puede usarse para hacer diseños de restricciones. Hacer aplicaciones básicas es definitivamente más fácil de aprender en Android, pero a medida que profundizamos en fragmentos y otras cosas, comienza a complicarse
Fragmentos vs componentes (widgets) : simplemente podemos usar el componente del widget donde quisiéramos, a diferencia de los fragmentos que hacemos en Android, que requieren cierto conocimiento de antemano sobre cómo usar el paquete, adaptadores, diseños XML y diferentes métodos como OnCreateView y Layoutinflator
Base de datos SQL : es bastante similar en ambas tecnologías. La única diferencia es que la administración del estado puede entrar en su lugar si está tratando de agregar algo consecutivamente, tendría que almacenar la clave en el estado y cambiarla usando setstate () {_ key+= 1} -> Solo un caso de uso. La biblioteca de la habitación en Android es bastante amplia y fácil de implementar también
Patrones de arquitectura : todo se reduce a MVP/ MVVM/ MVC en Android, mientras que tenemos bloque y proveedores en Flutter, que hacen algo similar a MVC, separando la lógica comercial creando sumideros y corrientes
Editor de código - VSCODE/Android Studio - Flutter y Android Studio para Android
Guía de inicio - Bastante Straighforward para Android, descargue el estudio y comience, mientras que tienes que hacer un montón de cosas para Flutter, puede ser molesto
Firebase - Recursos para 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
Conexión de Firebase : definitivamente más fácil de implementar para Flutter, puede hacerlo en 20 líneas de código dependiendo de la vista de la lista que realice. Los conceptos básicos son los mismos, necesita los archivos .json y debe agregarlo a la consola Firebase. La codificación en Flutter te ayuda a entenderlo de una manera mucho mejor. En general, es similar.
Listas + Firebase : Android tiene vistas locas de reciclador que hacen que todo sea tan difícil, e integrar Firebase + Recycler View tiene alrededor de 200 artículos, y simplemente no puede dominarlo. No había forma de que pudiera implementar algo en Android sin un tutorial, pero en Flutter, siempre puedes intentarlo
Obtener datos, presionar datos : impulsar los datos también es más fácil en Flutter Firebase, hay literalmente un método ONTAP () que le permite enviar una instantánea de los datos
Aprendizaje automático : integrar el aprendizaje automático
UI - Flutter y RN tienen un sistema de archivos, donde defina las reglas y la interfaz de usuario. Personalmente, me gusta la interfaz de las aplicaciones Flutter, ya que está mucho más definida. También es mantenido por Google que posee Android y puede tener una integración mucho mejor con Google.
Clases - Flutter usa widgets para literalmente todo, desde textViews hasta tabviews, se llaman 'widgets'. Flutter usa Dart, mientras que React Native usa TypeScript o JavaScript.
Componentes : RN tiene componentes y tenemos que importarlos de 'React -Native' para usarlos. Flutter tiene widgets que se pueden usar en un espacio similar. Ambos son similares, excepto el estilo y la parte de representación.
Flutter de estilo : widgets interiores - Entonces, si desea relleno => envuelve el widget en el widget de relleno () con algo de relleno, reacciona nativa: define el estilo constante: hojas de estilo y agregue sus estilos allí, similar al estilo web donde tiene CSS. Entonces React Native tiene un estilo CSS, mientras que Flutter tiene el estilo 'widget'
Animaciones : Flutter es mucho más fácil de Grasb, mientras que React Native tiene un aspecto más amplio.
Curva de aprendizaje : similar en React Native y Flutter.
Bibliotecas : NPM ayuda en React Native, mientras que para Flutter solo las agregamos al archivo pubspec.yaml
API : ambos tienen una visión clara sobre el uso de API. Un buen artículo para RN-https://medium.com/better-programming/handling-api-like-a-boss-in-react-native-364abd92dc3d
Editor de código : vs código es popular para ambos
Comenzando : personalmente, ha sido muy difícil trabajar con React Native en Windows. Es mucho mejor si usas una Mac, pero en general esa pantalla roja te molesta mucho. Flutter no tiene la guía de inicio más fácil, pero hay apoyo para ayudarlo.
En general , ambas pueden hacer aplicaciones nativas de Cross y elegiré Flutter cualquier día - Hackathons/ Quick Projects/ Learn Android también, y React Native - Web/ Learn React.js/ -> Si desea estresarse: 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 a un botón, TextView, etc. en Android para voz https://steemit.com/utopian-io/@tensor/advanced-flutter-project ---Best-Practices-Generic-Bloc-Providers-Part-Tree
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,);