Autor: Eric Grandt
Com a crescente complexidade dos sistemas e aplicativos, "escrever uma vez, executar em qualquer lugar" começou a se tornar o objetivo final de mais e mais ferramentas de desenvolvimento.
Com base nisso, o Google lançou a estrutura de interface do usuário móvel Flutter na I / O Conference 2017, que permite aos desenvolvedores construir rapidamente interfaces de usuário nativas de alta qualidade em sistemas iOS e Android. Ao mesmo tempo, a Apple também trouxe o SwiftUI, uma estrutura de IU que pode abranger os principais sistemas operacionais da Apple, para desenvolvedores na WWDC 2019.
Então, sob essa tendência, uma ferramenta como o Flutter é realmente o futuro de uma nova geração de desenvolvimento móvel?
Há alguns anos, me envolvi no desenvolvimento de Android e iOS, usando Java e Objective-C. Depois de passar cerca de um mês estudando, decidi não estudar a fundo. Eu simplesmente não consigo encontrar o estado que vai fundo nisso.
Mas recentemente, aprendi sobre o Flutter e decidi tentar novamente na direção do desenvolvimento de aplicativos móveis. Eu imediatamente me apaixonei por ele porque torna o desenvolvimento de aplicativos multiplataforma divertido. Desde que aprendi sobre isso, usei-o para criar um aplicativo e uma biblioteca. Flutter parece ser um passo muito promissor e quero explicar várias razões pelas quais acredito nisso.
1. Suporte técnico fornecido pela Dart
Flutter usa a linguagem Dart desenvolvida pelo Google. Se você já usou Java antes, estará familiarizado com a sintaxe do DART porque eles são muito semelhantes. Mas, além da sintaxe, o Dart é muito diferente do Java.
Não vou discutir o Dart em profundidade, para não divagar, mas quero discutir seus recursos mais úteis, na minha opinião. Esta função é uma operação assíncrona. O Dart não apenas oferece suporte a operações assíncronas, mas também o torna muito fácil.
Se você estiver fazendo IO ou outras operações demoradas (como consultar o banco de dados), poderá usar operações assíncronas em todos os aplicativos Flutter. Se não houver operação assíncrona, qualquer operação demorada fará com que o programa congele até que a operação seja concluída. Para evitar isso, o Dart nos fornece as palavras-chave async e await para permitir que nosso programa continue a execução enquanto espera a conclusão dessas operações mais longas.
Vejamos alguns exemplos: um com operações assíncronas e outro sem.
// Without asynchronous operations
import 'dart:async';
main() {
longOperation();
printSomething();
}
longOperation() {
Duration delay = Duration(seconds: 3);
Future.delayed(delay);
print('Waited 3 seconds to print this and blocked execution.');
}
printSomething() {
print('That sure took a while!');
}
Produto t:
Waited 3 seconds to print this and blocked execution.
That sure took a while!
Isso não é ideal. Ninguém quer usar um aplicativo que travará ao realizar operações longas. Então, vamos modificá-lo um pouco e usar as palavras-chave async e await.
// With asynchronous operations
import 'dart:async';
main() {
longOperation();
printSomething();
}
Future<void> longOperation() async {
var retVal = await runLongOperation();
print(retVal);
}
const retString = 'Waited 3 seconds to return this without blocking execution.';
Duration delay = Duration(seconds: 3);
Future<String> runLongOperation() => Future.delayed(delay, () => retString);
printSomething() {
print('I printed right away!');
}
E a saída novamente:
I printed right away!
Waited 3 seconds to return this without blocking execution.
Com operações assíncronas, enquanto executamos o código que leva muito tempo para ser concluído, a execução do resto do código não será prejudicada.
2. Escreva o código apenas uma vez e execute-o no Android e no iOS
Considerando a necessidade de usar diferentes bases de código para Android e iOS, o desenvolvimento de aplicativos móveis pode levar muito tempo. A menos que você use um SDK como o Flutter, você terá uma base de código que pode se adaptar a ambos os sistemas operacionais. Além disso, você também pode executá-los de forma totalmente nativa. Isso significa que coisas como navegar nas páginas e navegação funcionam perfeitamente com diferentes sistemas operacionais.
Resumindo, contanto que você tenha um dispositivo ou simulador em execução, o Flutter pode tornar o processo de construção e execução de seu aplicativo para teste tão simples quanto seus dedos.
Três, desenvolvimento de IU
O desenvolvimento da interface do usuário é quase uma das coisas que não espero. Eu sou mais um desenvolvedor de back-end, então quando se trata de coisas que dependem muito disso, eu só quero algo simples. É aqui que Flutter brilha em meus olhos.
A IU é criada combinando diferentes widgets e modificando-os para se adequar à aparência do seu aplicativo. Você pode controlar quase completamente como esses widgets são exibidos, então você sempre obterá o que deseja no final. Para definir o layout da IU, você pode usar widgets como Linha, Coluna e Contêiner. Para conteúdo, existem como Text e RaisedButton. Esses são apenas alguns dos widgets fornecidos pelo Flutter, e há muitos outros além desses. Usando esses widgets, podemos construir uma IU muito simples:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter App'),
centerTitle: true,
elevation: 0,
),
body: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
child: Text('Some text'),
),
Container(
child: RaisedButton(
onPressed: () {
// Do something on press
},
child: Text('PRESS ME'),
),
),
],
),
],
),
);
}
[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. É recomendável salvar a imagem e enviá-la diretamente (img-gcd7ipPE-1594103092983) (https://upload-images.jianshu.io/ upload_images / 22436740-905dc24af6484113? imageMogr2 / auto-orient / strip% 7CimageView2 / 2 / w / 1240)]
Flutter é como um mágico com uma variedade de adereços, permitindo que você crie facilmente temas de aplicativos. Você pode alterar manualmente a fonte, a cor e definir tudo um por um, mas vai demorar muito. Em vez disso, o Flutter nos fornece algo chamado ThemeData, que nos permite definir valores para cores, fontes, campos de entrada, etc. Esse recurso é excelente para manter a consistência da aparência do aplicativo.
theme: ThemeData(
brightness: Brightness.dark,
canvasColor: Colors.grey[900],
primarySwatch: Colors.teal,
primaryColor: Colors.teal[500],
fontFamily: 'Helvetica',
primaryTextTheme: Typography.whiteCupertino.copyWith(
display4: TextStyle(
color: Colors.white,
fontSize: 36,
),
),
),
Usando este ThemeData, definimos a cor do aplicativo, a família da fonte e alguns estilos de texto. Tudo, exceto o estilo de texto, será aplicado automaticamente a todo o aplicativo. O estilo de texto de cada widget deve ser definido manualmente um por um, mas ainda é muito simples:
child: Text(
'Some text',
style: Theme.of(context).primaryTextTheme.display4,
),
Para melhorar ainda mais a eficiência, o Flutter pode recarregar o aplicativo a quente, para que você não precise reabri-lo sempre que alterar a IU. Você pode fazer alterações agora, salvá-las e ver o efeito das alterações em cerca de um segundo.
Quarto, a biblioteca
Flutter fornece muitos recursos poderosos prontos para uso, mas às vezes você precisa de mais recursos. Considerando o grande número de bibliotecas disponíveis para Dart e Flutter, isso não é um problema. Você tem interesse em anunciar em seu aplicativo? Existem bibliotecas para isso. Quer novos widgets? Existem bibliotecas para isso.
Se preferir fazer você mesmo, você pode criar sua própria biblioteca e compartilhá-la com outras pessoas da comunidade imediatamente. Adicionar uma biblioteca ao projeto é muito simples e pode ser feito adicionando uma linha de código ao arquivo pubspec.yaml. Por exemplo, se você deseja adicionar a biblioteca sqflite:
dependencies:
flutter:
sdk: flutter
sqflite: ^1.0.0
Depois de adicioná-lo ao arquivo, execute flutter packages get e pronto. Várias bibliotecas tornam o desenvolvimento de aplicativos Flutter uma brisa e economizam muito tempo no processo de desenvolvimento.
Cinco, desenvolvimento de back-end
A maioria dos aplicativos agora depende de algum tipo de dado, e todos esses dados precisam ser armazenados em algum lugar para que possam ser exibidos e usados posteriormente. Portanto, é muito importante manter isso em mente ao procurar novos SDKs (como Flutter) para criar aplicativos.
Novamente, Flutter App é feito usando Dart, e Dart é muito bom no desenvolvimento de back-end. Falei sobre muitas funções simples e fáceis neste artigo, e o desenvolvimento back-end do Dart e Flutter não é exceção. Seja para iniciantes ou especialistas, criar aplicativos baseados em dados é muito simples, mas essa simplicidade não é o mesmo que qualidade.
Você pode usar bibliotecas para que possa usar o banco de dados de sua escolha. Usando a biblioteca sqflite, podemos iniciar e executar o banco de dados SQLite muito rapidamente. Graças ao modelo de uma peça, podemos acessar o banco de dados e consultar de quase qualquer lugar sem ter que recriar um objeto todas as vezes.
class DBProvider {
// Singleton
DBProvider._();
// Static object to provide us access from practically anywhere
static final DBProvider db = DBProvider._();
Database _database;
Future<Database> get database async {
if (_database != null) {
return _database;
}
_database = await initDB();
return _database;
}
initDB() async {
// Retrieve your app's directory, then create a path to a database for your app.
Directory documentsDir = await getApplicationDocumentsDirectory();
String path = join(documentsDir.path, 'money_clip.db');
return await openDatabase(path, version: 1, onOpen: (db) async {
// Do something when the database is opened
}, onCreate: (Database db, int version) async {
// Do something, such as creating tables, when the database is first created.
// If the database already exists, this will not be called.
}
}
}
Depois de recuperar os dados do banco de dados, você pode usar um modelo para transformá-los em objetos. Ou, se quiser armazenar o objeto em um banco de dados, você pode usar o mesmo modelo para convertê-lo em JSON.
class User {
int id;
String name;
User({
this.id,
this.name,
});
factory User.fromJson(Map<String, dynamic> json) => new User(
id: json['id'],
name: json['name'],
);
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
};
}
Se não houver maneira de mostrá-lo ao usuário, os dados não são tão úteis. É quando o Flutter entra em cena com widgets como FutureBuilder ou StreamBuilder. Se você estiver interessado em usar Flutter, SQLite e outras tecnologias para criar aplicativos orientados a dados para uma compreensão mais profunda, sugiro que você verifique este artigo:
- " Usando Streams, BLoCs e SQLite no Flutter ": Streams, BLoCs e SQLite são uma boa combinação ao processar dados no Flutter.
Seis, algumas reflexões finais
Com o Flutter, existem possibilidades quase infinitas, então até mesmo aplicativos enormes podem ser criados facilmente. Se você está desenvolvendo um aplicativo móvel e ainda não experimentou o Flutter, recomendo fortemente que experimente, porque acredito que você também vai adorar. Depois de usar o Flutter por alguns meses, acho que pode ser dito que este é o futuro do desenvolvimento móvel. Se o futuro não pode ser contado, este é definitivamente um passo na direção certa.
Último
Aqui também compartilho um PDF de aprendizagem Android + vídeo de arquitetura + documento de entrevista + notas de origem , mapa mental avançado de tecnologia de arquitetura avançada, materiais especiais de entrevista de desenvolvimento Android, materiais de arquitetura avançada avançada coletados e organizados por vários caras importantes .
Estes são materiais excelentes que vou ler repetidas vezes nas minhas horas vagas. Pode ajudar efetivamente a todos a dominar o conhecimento e compreender os princípios Claro, você também pode usá-lo para verificar se há omissões e melhorar sua competitividade.
Se precisar, você pode obtê-lo aqui
Se você gostou deste artigo, você também pode me dar um pequeno like, deixar uma mensagem na área de comentários ou encaminhar e apoiá-la ~