Escolar Documentos
Profissional Documentos
Cultura Documentos
Dart POO
Dart POO
Classes
import 'camiseta.dart';
void main() {
// assim cria uma instancia da classe camiseta
var camisetaNike = Camiseta();
camisetaNike.tamanho = 'G';
camisetaNike.cor = 'Preta';
camisetaNike.marca = 'Nike';
print('''
Camiseta:
Tamanho ${camisetaNike.tamanho}
Cor: ${camisetaNike.cor}
Marca: ${camisetaNike.marca}
tipoLavagem: ${camisetaNike.tipoLavagem()}
''');
'camiseta.dar
// Publico public
// Privado private
// Caracteristicas
// Comportamentos
class Camiseta {
// Atributos de instância
String? tamanho;
// colocando como privado
String? _cor;
String? marca;
// encapsulamento
// metodos para ser acessado
String? get cor => _cor;
set cor(String? cor) {
if (cor == 'Verde') {
throw Exception('Não pode ser Verde');
}
}
// Atributo de classe
//! boa pratica todo atributo static deve ser const
static const String nome = 'Camiseta';
// Metodos de classe
static String recuperarNome() => nome;
// classe privada
class _Camiseta1 {
void recuperadorCor() {
var camiseta = Camiseta();
camiseta._cor = 'Verde';
}
}
Construtores
import 'pessoa.dart';
void main() {
var pessoa = Pessoa(
nome: 'Rodrigo Rahman',
idade: 38,
sexo: 'Masculino',
);
print(pessoa.nome);
// chamar construtor nomeado
var pessoaNomeado = Pessoa.semNome(idade: 38, sexo: 'Feminino');
}
'pessoa.dart'
class Pessoa {
String? nome;
int? idade;
String? sexo;
Pessoa({
required String nomeConstrutor,
required int idadeConstrutor,
required String sexoConstrutor,
}) {
nome = nomeConstrutor;
idade = idadeConstrutor;
sexo = sexoConstrutor;
}**/
Pessoa({
required this.nome,
required this.idade,
required this.sexo,
});
// construtor nomeado
Pessoa.semNome({
required this.idade,
required this.sexo,
});
Pessoa.vazia();
// factory = fabrica
// fabrica uma instancia de uma pessoa
//! utilizado para quando precisamos criar uma regra para criação da
nossa classe
factory Pessoa.fabrica(String nomeConstruc){
var nome = nomeConstruc + '_Fabrica';
var pessoa = Pessoa.vazia();
pessoa.nome = nome;
return pessoa;
}
}
Inicializadores
class Produto {
final int? _id;
final String? nome;
final double? _preco;
Herança
import 'cachorro.dart';
void main(){
var cachorro = Cachorro(idade: 10);
cachorro.tamanho = 'Grande';
print('''
Cachorro:
Tamanho: ${cachorro.tamanho}
Idade: ${cachorro.idade}
Idade Humana: ${cachorro.calcularIdadeHumana()}
''');
}
'cachorro.dart'
import 'animal.dart';
Cachorro({required super.idade});
//Cachorro({required int idade}) : super(idade: idade);
@override // metadados
int calcularIdadeHumana() {
return idade * 7;
}
'animal.dart'
String? tamanho;
int idade;
Animal({required this.idade});
int recuperarIdade(){
return idade;
}
Herança Covariante
import 'fruta.dart';
import 'humano.dart';
import 'banana.dart';
import 'macaco.dart';
void main(){
var humano = Humano();
humano.comer(Fruta());
'humano.dart'
import 'fruta.dart';
import 'mamifero.dart';
'fruta.dart'
class Fruta{
'mamifero.dart'
import 'fruta.dart';
import 'banana.dart';
import 'mamifero.dart';
'banana.dart'
import 'fruta.dart';
Banana(this.tipo);
}
Associação
class Pessoa{
String? nome;
// Agregação
// Quando um atributo de associação não é obrgatório
// Nós estamos falando de agregação !!!
Telefone? relefone;
}
class Endereco{}
class CPF{}
class Telefone{}
Polimorfismo
import 'anestesista.dart';
import 'obstreta.dart';
import 'pediatra.dart';
import 'residenteDeAnestesia.dart';
import 'medico.dart';
void main(){
// O polimorfismo permite que classes abstratas consigam receber
comportamentos através de classes concretas.
// Parto
// Realizar um parto
for(var medico in medicos){
medico.operar();
}
}
anestesista.dart
import 'medico.dart';
medico.dart
import 'medico.dart';
pediatra.dart
import 'medico.dart';
residenteDeAnestesia.dart
import 'anestesista.dart';
void main(){
var gol = Gol();
printDadosDoCarro(gol);
}
carro.dart
int velocidadeMaxima();
}
gol.dart
import 'carro.dart';
@override
int portas = 4;
@override
int rodas = 4;
@override
int velocidadeMaxima() {
return 120;
}
uno.dart
import 'carro.dart';
@override
int portas = 4;
@override
int rodas = 4;
@override
int velocidadeMaxima() {
return 80;
}
}
Auto promoção
import 'uno.dart';
import 'carro.dart';
import 'gol.dart';
void main(){
var gol = Gol();
var uno = Uno();
printDadosDoCarro(gol);
printDadosDoCarro(uno);
carro.dart
}
}
// Isso aqui é uma interface
// Pois não tem nunhum método implementado!!!
abstract class Carro{
int velocidadeMaxima();
}
import 'carro.dart';
@override
int portas = 4;
@override
int rodas = 4;
@override
int velocidadeMaxima() {
return 120;
}
String tipoDeRodas(){
return 'Esportes';
}
uno.dart
import 'carro.dart';
@override
int portas = 4;
@override
int rodas = 4;
@override
int velocidadeMaxima() {
return 80;
}
Mixins
import 'joao.dart';
void main(){
var joao = Joao();
print('''
João:
Habilidade: ${joao.habilidade()}
Cantar: ${joao.cantar()}
Dançar: ${joao.dancar()}
''');
}
joao.dart
import 'artista.dart';
import 'cantar.dart';
import 'dancar.dart';
cantar.dart
dancar.dart
import 'artista.dart';
@override
String habilidade(){
return 'Dançar';
}
}
Cascade notation
void main() {
print('''
Pessoa:
Nome: ${pessoa.nome}
Email: ${pessoa.email}
Site: ${pessoa.site}
''');
}
class Pessoa{
String? nome;
String? email;
String? site;
}
Callable class
import 'enviar_email.dart';
void main(){
var enviarEmail = EnviarEmail();
enviarEmail('alex.sdmg@gmail.com');
}
enviar_email.dart
class EnviarEmail{
void main() {
var num1 = Numero(10);
var num2 = Numero(20);
numero.dart
class Numero{
int i;
Numero(this.i);
Assignment operators
void main(){
// = -= /= %= >>= ^=
// += *= ~/= <<= &= |=
var numero = 1;
numero = numero + 2;
// assignment operators
numero += 2;
print(numero);
}
Equals hashcode
import 'pessoa.dart';
void main() {
var p1 = Pessoa(nome: 'Rodrigo', email:
'rodrigorahman@academiadoflutter.com');
var p2 = Pessoa(nome: 'Rodrigo', email:
'rodrigorahman@academiadoflutter.com');
print(p1.hashCode);
print(p2.hashCode);
print(p1);
if(p1 == p2){
print('É igual');
} else {
print(' Não é igual');
}
}
pessoa.dart
class Pessoa {
String nome;
String email;
Pessoa({
required this.nome,
required this.email,
});
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
@override
int get hashCode => nome.hashCode ^ email.hashCode;
@override
String toString() {
return '''
Pessoa:
nome: $nome,
email: $email
''';
}
}
Ordenação default
import 'cliente.dart';
void main(){
var c1 = Cliente(nome: 'Alex', telefone: '123456798');
var c2 = Cliente(nome: 'Kenia', telefone: '646131451');
var c3 = Cliente(nome: 'Gabriela', telefone: '98423123');
var c4 = Cliente(nome: 'Jacqueline', telefone: '564642135');
print(lista);
lista.sort();
print(lista);
}
cliente.dart
Cliente({
required this.nome,
required this.telefone,
});
@override
String toString() => 'Cliente(nome: $nome, telefone: $telefone)';
@override
int compareTo(Cliente other) {
return nome.compareTo(other.nome);
}
}
Asserts
import 'cliente.dart';
void main(){
var cli = Cliente(
cpf: '13213',
nome: 'salslaslas',
//razaoSocial: 'kfkkdfd',
//cnpj: '132454'
);
}
cliente.dart
class Cliente {
String? nome;
String? cpf;
String? razaoSocial;
String? cnpj;
Cliente({
this.nome,
this.cpf,
this.razaoSocial,
this.cnpj,
}) : assert((cpf != null) ? nome != null && razaoSocial == null && cnpj
== null : true, 'Você enviou cpf junto com cnpj');
}
Modificadores
import 'pessoa.dart';
void main(){
var p1 = const Pessoa(nome: 'Rodrigo', idade: 37);
var p2 = const Pessoa(nome: 'Rodrigo', idade: 37);
print(p1 == p2);
}
pessoa.dart
class Pessoa{
final String nome;
final int idade;
const Pessoa({
required this.nome,
required this.idade
});
}
Extension
import 'pessoa.dart';
import 'pessoa_saudacao_extension.dart';
import 'saudacao_string_extension.dart';
void main(){
// extensions é a capacidade de adicionar funcoes dentro de classes que
você não tem o codigo fonte
var nome = 'Rodrigo Rahman';
print(p1.saudacao());
}
pessoa.dart
class Pessoa{
String nome;
Pessoa({
required this.nome
});
}
pessoa_saudacao_extension.dart
import 'pessoa.dart';
saudacao_string_extension.dart
Metadatas
import 'dart:mirrors';
import 'fazer.dart';
import 'pessoa.dart';
void main() {
final p1 = Pessoa();
classMirror.metadata.forEach((annotation) {
var instanceAnnotation = annotation.reflectee;
if(instanceAnnotation is Fazer){
print('Quem: ${instanceAnnotation.quem}');
print('O Que: ${instanceAnnotation.oque}');
}
});
classMirror.declarations.values.forEach((declarationMirror) {
if(declarationMirror is VariableMirror){
declarationMirror.metadata.forEach((annotation) {
var instanceAnnotation = annotation.reflectee;
if(instanceAnnotation is Fazer){
print('VARIAVEIS!!!!');
print('Quem: ${instanceAnnotation.quem}');
print('O Que: ${instanceAnnotation.oque}');
}
});
} else if(declarationMirror is MethodMirror){
declarationMirror.metadata.forEach((annotation) {
var instanceAnnotation = annotation.reflectee;
if(instanceAnnotation is Fazer){
print('METODOS!!!!');
print('Quem: ${instanceAnnotation.quem}');
print('O Que: ${instanceAnnotation.oque}');
}
});
}
});
}
fazer.dart
class Fazer{
final String quem;
final String oque;
pessoa.dart
import 'package:dart_poo/20_metadatas/fazer.dart';
}
}
Getters Setters
void main() {
var pessoa = Pessoa();
print(pessoa.nome);
pessoa.nome = 'Rodrigo Rahman';
}
//! uso de get e set só usar quando tiver regra de negocio como o exemplo
abaixo
class Pessoa {
String? _nome;
class Pessoa {
String nome;
Pessoa(this.nome);
Pessoa.nome(this.nome);
}
Tipos genéricos
void main() {
final caixa = Caixa<Bola>();
caixa.adicionar(Bola());
Bola? itemCaixa = caixa.getItem();
I? getItem() {
return _item;
}
double alturaItem() {
return _item?.altura() ?? 0;
}
}
Part of
import 'cpf.dart';
endereco.dart
part of 'pessoa.dart';
//! se precisar de importar algo tem que ser pela class principal
class _Endereco {}
cpf.dart
class Cpf {
Conversões
import 'aluno.dart';
void main() {
var frutas = [
Fruta('Banana'),
Fruta('Abacaxi'),
Fruta('Laranja')
];
var frutasMap = [
{'nome': 'B anana'},
{'nome': 'Abacaxi'},
{'nome': 'Laranja'}
];
print(sucos);
print(sucos2);
class Suco {
String sabor;
Suco({
required this.sabor,
});
@override
String toString() {
return 'Suco{sabor=$sabor}';
}
}
class Fruta {
String nome;
Fruta(this.nome);
aluno.dart
class Aluno {
String nome;
List<Curso> cursos;
Aluno({
required this.nome,
required this.cursos,
});
@override
String toString() => 'Aluno(nome: $nome, cursos: $cursos)';
}
class Curso {
String nome;
String descricao;
Curso({
required this.nome,
required this.descricao,
});
@override
String toString() => 'Curso(nome: $nome, descricao: $descricao)';
}