Para pessoas que já conhecem o Android:
UI - Android precisa de integração XML, enquanto tudo é um widget em vibração e pode ser feito em um único arquivo
Os ouvintes não há mais ouvintes para o OnClicks, chame os métodos, mude o estado e aprecie a vista
FindView - não há mais findviewById () - basta fazer tudo dentro do widget () {} e deixar a descoberta para o Android
Gradle - Não há mais problemas de graduação - Adicione dependências no arquivo pubSpec.yaml e atualize o aplicativo para usar as novas bibliotecas
Os ativos - devem ser gerenciados separadamente em vibração, você deve declarar tudo o que usa - para por exemplo: imagens, fontes. No Android, você pode simplesmente adicioná -lo na seção de arquivos e usá -los.
As animações são muito mais fáceis e bem suportadas em Flutter - Usos Básicos - Por exemplo: Atividade de Splash, Guias de Swiping, Resultados, Página de Analytics, Navegação
Executando o aplicativo - Recarregar a quente em Flutter - Basta acertar 'R' para recarregar e 'r' para uma reinicialização do aplicativo. O Android Studio pode levar até 20 a 30 segundos para cada recarga e ainda mais se houver problemas graduados, que aparecem de vez em quando
API - APIs Android pode ser feita com diferentes bibliotecas, como a modernização, usando GSON, enquanto a busca em vibração pode ser feita sem dor. A função de busca comum pode ser usada no Flutter e ter métodos assíncronos aguardados para chamar as APIs.
Visualização de reciclador/lista - A exibição de reciclador é usada no Android para criar listas diferentes em uma tela. Precisamos de um adaptador para o que possui uma interface e precisamos conhecer todos os tipos de funções diferentes para implementá -lo completamente. O Flutter apenas tem um widget para uma ListView, onde podemos definir diferentes listas ou apenas adicionar coisas dinamicamente. Muito mais fácil, parece mais simples.
Curva de Aprendizagem - Trabalhar em Flutter é mais fácil quando você conhece o DART, que é semelhante ao JavaScript, e entenda os conceitos básicos sobre widgets. O Android permite fazer layouts com a ajuda do designer, que pode ser usado para fazer layouts de restrição. Fazer aplicações básicas é definitivamente mais fácil de aprender no Android, mas à medida que nos aprofundamos em fragmentos e outras coisas, começa a ficar complicado
Fragmentos vs componentes (widgets) - Podemos simplesmente usar o componente do widget onde quisermos, diferente dos fragmentos que fazemos no Android, que requerem algum conhecimento antes de usar o pacote, adaptadores, layouts XML e diferentes métodos como OnCreateView e LayoutInfLator
Banco de dados SQL - é bem semelhante nas duas tecnologias. A única diferença é que o gerenciamento do estado pode entrar em vigor se você estiver tentando adicionar algo consecutivamente, você precisaria armazenar a chave no estado e alterá -la usando o setState () {_ _ Key+= 1} -> apenas um caso de uso. A biblioteca da sala no Android é bem usada e fácil de implementar também
Padrões de arquitetura - tudo se resume a MVP/ MVVM/ MVC no Android, enquanto temos bloco e provedores em flutter, que fazem algo semelhante ao MVC, separando a lógica de negócios criando pia e fluxos
Editor de código - VSCode/Android Studio - Flutter e Android Studio para Android
Introdução ao guia - bastante direto para o Android, baixar o estúdio e começar, enquanto você precisa fazer um monte de coisas para vibrar - pode ser irritante
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-da239hy4
https://www.youtube.com/channel/ucftm1fgjzskospdzgtbp7ha/search?Query=fireBase
https://codelabs.developers.google.com/codelabs/flutter-firebase/#0
Conexão do Firebase - Definitivamente mais fácil de implementar para o Flutter, você pode fazê -lo em 20 linhas de código, dependendo da visualização da lista que você faz. O básico é o mesmo, você precisa dos arquivos .json e precisa adicioná -los ao console do Firebase. A codificação em vibração ajuda você a entendê -lo de uma maneira muito melhor. No geral, é semelhante.
Listas + Firebase - O Android possui vistas loucas de reciclador que tornam tudo tão difícil, e a integração do Firebase + Recycler View tem cerca de 200 artigos, e você simplesmente não pode dominá -lo. Não havia como eu ter implementado algo no Android sem um tutorial, mas em vibração, você sempre pode tentar
Buscando, pressionando os dados - pressionar os dados também é mais fácil na Flutter Firebase, há literalmente um método ontap () que permite enviar um instantâneo dos dados
Aprendizado de máquina - Integração de Machine Learning
UI - Flutter e RN têm um sistema de arquivos, onde você define as regras e a interface do usuário. Pessoalmente, gosto da interface dos aplicativos de fleta, pois é muito mais definido. Também é mantido pelo Google, dono do Android e pode ter uma integração muito melhor com o Google.
Classes - Flutter usa widgets para literalmente tudo, de visualizações de texto a TabViews - são chamadas de 'widgets'. O Flutter usa o DART, enquanto o React Native usa o TypeScript ou JavaScript.
Componentes - RN possui componentes e precisamos importá -los de 'React -native' para usá -los. O Flutter possui widgets que podem ser usados em um espaço semelhante. Ambos são semelhantes, exceto o estilo e a parte de renderização.
Estilo Flutter - widgets internos - então, se você deseja preencher => enrolar o widget no widget de preenchimento () com algum preenchimento, reaja nativo: você define o estilo const: shylesheet e adicione seus estilos lá - semelhante ao estilo da web onde você tem CSS. Portanto, o React Native tem um estilo CSS, enquanto o Flutter tem o estilo 'widget'
Animações - Flutter é muito mais fácil de entender, enquanto o React Native tem um aspecto mais amplo
Curva de aprendizado - similar no react nativo e vibrar.
Bibliotecas - NPM ajuda a reagir, enquanto que para o Flutter apenas os adicionamos ao arquivo pubSpec.yaml
APIs - Ambos têm uma visão clara sobre o uso de APIs. Um bom artigo para rn-https://medium.com/better-programming/handling-api-like--boss-in-react-native-364abd92dc3d
Editor de código - vs código é popular para ambos
Começando - pessoalmente, tem sido realmente difícil trabalhar com o React Native no Windows. É muito melhor se você usar um Mac, mas no geral essa tela vermelha o incomoda muito. O Flutter não tem o guia mais fácil de iniciar, mas há apoio para ajudá -lo.
No geral - ambos podem fazer aplicativos nativos cruzados e eu escolherei o Flutter de qualquer dia - Hackathons/ Rick Projects/ Learn Android também e reagir nativo - web/ aprender react.js/ -> Se você quiser se estressar: 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 um botão, textView etc. no Android para overs de voz https://steemit.com/utopian-io/@tensor/advanced-flutter-project---best-practices-generic-bloc-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,);