Esse conteúdo só é possível graças aos Membros do Canal Flutterando!! A Todos os membros muuuuuito obrigado Devs por todo o apoio!! Link do Clean Dart: github.com/Flutterando/Clean-Dart
9:20 acho que cabe uma discursão, uma vez o call já define que será apenas aquele método. Ou seja, aplicado: Single Responsibility Principle e Liskov Substitution Principle. Não há nada referindo para tormar a decisão de uma segunda classe.
Cara tá bem difícil acompanhar o curso estando na versão com null safety, consegui avançar um pouco com os comentários, mas ainda estou travado, já está bem diferente do vídeo.
to pegando um erro no expect do primeoro expect(result | null, isA()); Diz que The argument type 'Null' can't be assigned to the parameter type 'List' Não consegui achar a causa Aula muito boa parabéns!
pq com o null safety o List nunca pode ser nulo, para solucionar vc adiciona operador nullable, ficando assim: List? Tanto na classe abstrata, quanto em sua implementação.
Podemos dizer que a Entidade é um Objeto do "Domain", enquanto o Model seria uma forma de visualizar essas informações do mundo real. Porem esse termo pode ter vários significados, por exemplo, uma entidade em Banco de Dados seria as tabelas. Aqui para a gente pode ser o que mais perto representaria a regra de negócio exportada para o "Mundo Real". Dentro de uma entidade vc pode ter validações e até mesmo outras coisas como regra de negócios relacionada a ela. Como no Clean Arch temos que respeitar tb os principios de Reponsabilidade única acabamos por deixar ela muito semelhante a um Modelo anêmico. Você vai ver eu usando um Model na próxima aula, e acredito que isso tb ajudará a sanar essa dúvida
Vi que na classe abstrata SearchByText você usou o call() para poder dar usecase() , direto, em vez de usar execute, mas e quando a classe abstrata terá mais de um método, como fica?
Cara uma duvida, um modulo pode ver o outro ? tipo, eu tenho uma entidade chamada Contas a Pagar que esta dentro do Modulo Financeiro, dentro dessa entidade, quero declaras uma propriedade que eh uma entidade de outro Modulo, que no caso seria o Modulo Cliente, isso estaria correto ?
Jacob, nao seria melhor separar as implementações e os contratos em arquivos diferentes? E usar notação do tipo interface no nome da classe para tornar mais limpo ? do tipo: i_search_by_text.dart ; search_by_text ou i_search_by_text.dart ; search_by_text_impl Outra coisa seria usar os commits individuais com as tipagens ( git-commit-msg-linter). ex "feat: ensure SearchResult should return a list of results"
Nesse caso achei que teria muitos arquivos, entao no usecase use dessa forma, mas nos outros exemplos a gente tem abstraçoes em um arquivo e as implementacoes em outros. Mas nao significa que está errado ou certo separar, é apenas um limite que decidi nao ter por isso. (Algumas pessoas nem colocam contratos nas implementações dos usecases e outras pessoas implementam o usecase em uma outra camada)
Flutterando Eu sei que nada e obrigatório, por isso levantei como sugestão , estou atualmente em um projeto em node com TS , e aplico interface em tudo , hj me da o dobro do trabalho, porem quando um Jr pegar o codigo , ele vai ficar restrito a fazer alterações que o contrato propõe, assim fica mais facil pra evitar erros por parte dos outros , e facilita a leitura e implementação de novas features , ate os imports eu fixo em um arquivo, enfim , joguem duro, asioso pelos próximos episodios.
Fala Jacob, tudo na paz? Estou implementando utilizando o Flutter 2.5, tive problemas com null safety no primeiro e segundo teste e consegui resolver, mas estou com um problema de tipagem quando uso o return Left(
Tive o mesmo problema, eu estou na versao 3.3.3 do FLUTTER No minuto 26:24 eu tive esse problema. Eu consegui resolver passando um return Future.value(Left(InvalidTextError())); Espero que ajude possa ajudar..
Parabéns Jacob, excelente curso. Só que tenho uma dúvida. Em um app mais complexo. Que possui as features Cliente, Produto e Pedido. A features Pedido precisa fazer referência a produtos e pedidos. Como se faria isso?
No caso de uma entidade ser útil em mais de um módulo, por exemplo, uma entidade de produtos que pode ser utilizada em um módulo de produtos e em outro módulo de carrinho de compras, qual seria a forma correta de usar as entities?
Qual extensão que vc usa para poder exibir o erro inline, ao invés de ter que passar o mouse em cima do erro? (exemplo aos 01:54). Aliás, qual tema do vscode você está usando? :)
Causa. Por isso não existe desacoplamento, e sim baixo acoplamento. O Either é importante pra fazer o dev tratar o erro, mesmo que forçadamente, e isso o torna bom pra arquitetura
O ideal seria isso ter nativo na linguagem Dart e o compilador ser esperto o bastante pra forçar você a tratar. Outras linguagens possuem isso através de pattern matching e etc.
O mockito 5.0.0 e superiores suportam null safety através de geração de código. Para executar a geração de código necessária, é preciso adicionar mais uma dependência no dev_dependencies chamada build_runner. Daí você deve criar o arquivo de teste com uma anotação especificando o mock. Exemplo: import 'package:mockito/annotations.dart'; @GenerateMocks([SearchRepository]) void main( ) { } e executar um comando no terminal: flutter pub run build_runner build. Esse comando vai gerar um arquivo de mock na mesma pasta do arquivo de teste que pode ser importado no arquivo de teste. Exemplo: final repository = MockSearchRepository();
Pelo amor de Deus. Preciso de ajuda. Estou há dois dias vasculhando a internet e quebrando a cabeça para resolver um problema e não consigo. Estou brincando uma estrutura muito similar a essa, mas no caso teste que é para validar o retorno de uma lista de entidade, o repositório mock devolve para o use case sempre uma lista nula quando não era para ser. Se alguém puder me ajudar eu agradeço: A interface Future searchTitle(String title); O Mock class DishRepositoryMock extends Mock implements IDishRepository {} no main instancio repository = DishRepositoryMock(); O Problema está nesse ponto: test('title parameter searched', () async { var listResult = dishList; when(repository.searchTitle(any)) .thenAnswer((_) async => Right(listResult)); dishList é uma função que retorna uma lista de entidades Dish. No debbug está gerando certo. Só que o usecase chama o método Search mockado e devolve um null para a chamada abaixo. var result = await searchUseCase.searchTitle("dish");
Galera eu tenho uma duvida, talvez alguém possa me ajudar. No caso da pasta entities, ele criou o "product", mas, caso eu estivesse em uma outra aplicação que tenha outros módulos (alem do search) e tivesse a necessidade de utilizar o "product" como seria essa comunicação. Vlws!!
Vc pode criar um Modelo DTO, ou pode ler o proprio Product, o grande problema e que vc tera que ter um adapter ou Mapper, entao ´e melhor enviar um model que herde de sua entidade e que faca isso
Também tenho essa mesma dúvida. Em um projeto com várias features, tipo cliente, produto e pedido. A feature pedido precisa acessar os recursos do cliente e produto. Como se faria isso. Já pesquisei em todo lugar na internet e não achei a resposta.
Conteúdo muito bom! Bastante claro.
Esse conteúdo só é possível graças aos Membros do Canal Flutterando!!
A Todos os membros muuuuuito obrigado Devs por todo o apoio!!
Link do Clean Dart:
github.com/Flutterando/Clean-Dart
Melhor série de todos os tempos na última semana.
heuheuheuehuehue boa
Excelente cara, os conceitos de SOLID e clean architecture, parabéns e obrigado pelo conteúdo!
9:20 acho que cabe uma discursão, uma vez o call já define que será apenas aquele método. Ou seja, aplicado: Single Responsibility Principle e Liskov Substitution Principle. Não há nada referindo para tormar a decisão de uma segunda classe.
Muito bom! Parabéns Jacob.
Não há como exprimir o quão bom foi essa aula :)
Excepcional!!! Parabéns!
Tbm sou iniciante, venho do javascript, e me perco mto nesses conceitos, mas seu conteúdo esta perfeito! aos poucos vou absorvendo...
Pro pessoal que tiver problemas de null-safety nos testes, recomendo usar o Mocktail
Nossa muito obrigado mano!!! Fiquei uns belos minutos caçando o que fazer auhauhuah
essa série está muito fantástica!!!
Cara tá bem difícil acompanhar o curso estando na versão com null safety, consegui avançar um pouco com os comentários, mas ainda estou travado, já está bem diferente do vídeo.
to pegando um erro no expect do primeoro
expect(result | null, isA());
Diz que The argument type 'Null' can't be assigned to the parameter type 'List'
Não consegui achar a causa
Aula muito boa parabéns!
pq com o null safety o List nunca pode ser nulo, para solucionar vc adiciona operador nullable, ficando assim:
List? Tanto na classe abstrata, quanto em sua implementação.
Muito bom! Sou iniciante, mas assistindo esse tipo de conteúdo fico inspirado, parabéns!
Muito bom, parabéns 🙂
geralmente onde ficaria o SearchByTextImpl? Dentro do próprio usecases tbm?
atualiza essas aulas práticas do clean architecture para o flutter com null safety
Jacob qual a diferenca entre entities e models? Ja li muito sobre isso e queria ouvir de voce, obrigado.
Podemos dizer que a Entidade é um Objeto do "Domain", enquanto o Model seria uma forma de visualizar essas informações do mundo real.
Porem esse termo pode ter vários significados, por exemplo, uma entidade em Banco de Dados seria as tabelas. Aqui para a gente pode ser o que mais perto representaria a regra de negócio exportada para o "Mundo Real". Dentro de uma entidade vc pode ter validações e até mesmo outras coisas como regra de negócios relacionada a ela. Como no Clean Arch temos que respeitar tb os principios de Reponsabilidade única acabamos por deixar ela muito semelhante a um Modelo anêmico. Você vai ver eu usando um Model na próxima aula, e acredito que isso tb ajudará a sanar essa dúvida
Saquei, provavelmente no exemplo pratico a ficha cai, valeu.
Vi que na classe abstrata SearchByText você usou o call() para poder dar usecase() , direto, em vez de usar execute, mas e quando a classe abstrata terá mais de um método, como fica?
Cara uma duvida, um modulo pode ver o outro ? tipo, eu tenho uma entidade chamada Contas a Pagar que esta dentro do Modulo Financeiro, dentro dessa entidade, quero declaras uma propriedade que eh uma entidade de outro Modulo, que no caso seria o Modulo Cliente, isso estaria correto ?
Jacob, nao seria melhor separar as implementações e os contratos em arquivos diferentes? E usar notação do tipo interface no nome da classe para tornar mais limpo ?
do tipo: i_search_by_text.dart ; search_by_text ou i_search_by_text.dart ; search_by_text_impl
Outra coisa seria usar os commits individuais com as tipagens ( git-commit-msg-linter). ex "feat: ensure SearchResult should return a list of results"
Nesse caso achei que teria muitos arquivos, entao no usecase use dessa forma, mas nos outros exemplos a gente tem abstraçoes em um arquivo e as implementacoes em outros. Mas nao significa que está errado ou certo separar, é apenas um limite que decidi nao ter por isso. (Algumas pessoas nem colocam contratos nas implementações dos usecases e outras pessoas implementam o usecase em uma outra camada)
Eu prefiro: search_by_text_interface.dart ; search_by_text no nome arquivo e na class ISearchByText e SearchByText na classe
Flutterando Eu sei que nada e obrigatório, por isso levantei como sugestão , estou atualmente em um projeto em node com TS , e aplico interface em tudo , hj me da o dobro do trabalho, porem quando um Jr pegar o codigo , ele vai ficar restrito a fazer alterações que o contrato propõe, assim fica mais facil pra evitar erros por parte dos outros , e facilita a leitura e implementação de novas features , ate os imports eu fixo em um arquivo, enfim , joguem duro, asioso pelos próximos episodios.
@@BwolfDev Perfeito
@@Gvfm1596 Essa forma de usar I no inicio eh coisa do C# e imp eh coisa do java =)
Fala Jacob, tudo na paz?
Estou implementando utilizando o Flutter 2.5, tive problemas com null safety no primeiro e segundo teste e consegui resolver, mas estou com um problema de tipagem quando uso o return Left(
Tive o mesmo problema, eu estou na versao 3.3.3 do FLUTTER
No minuto 26:24 eu tive esse problema.
Eu consegui resolver passando um return Future.value(Left(InvalidTextError()));
Espero que ajude possa ajudar..
Parabéns Jacob, excelente curso. Só que tenho uma dúvida. Em um app mais complexo. Que possui as features Cliente, Produto e Pedido. A features Pedido precisa fazer referência a produtos e pedidos. Como se faria isso?
Eu acredito que esse seria o mesmo modulo e nao separado
No caso de uma entidade ser útil em mais de um módulo, por exemplo, uma entidade de produtos que pode ser utilizada em um módulo de produtos e em outro módulo de carrinho de compras, qual seria a forma correta de usar as entities?
Estou com essa mesma dúvida. Não sei se colocaria na pasta core para uso global e faria uma DI.
Qual extensão que vc usa para poder exibir o erro inline, ao invés de ter que passar o mouse em cima do erro? (exemplo aos 01:54). Aliás, qual tema do vscode você está usando? :)
Renan Lopes error lens
Cara, parabéns. Só uma dúvida: usar o DartZ puro assim não cria um forte acoplamento com uma biblioteca de terceiros?
Causa.
Por isso não existe desacoplamento, e sim baixo acoplamento.
O Either é importante pra fazer o dev tratar o erro, mesmo que forçadamente, e isso o torna bom pra arquitetura
@@FlutterandoTV Entendi. Obrigado
O ideal seria isso ter nativo na linguagem Dart e o compilador ser esperto o bastante pra forçar você a tratar.
Outras linguagens possuem isso através de pattern matching e etc.
Estou tendo problemas com o null safity. O teste está dando o erro: type 'Null' is not a subtype of type 'Future'. Como faço para adaptar?
O mockito 5.0.0 e superiores suportam null safety através de geração de código. Para executar a geração de código necessária, é preciso adicionar mais uma dependência no dev_dependencies chamada build_runner. Daí você deve criar o arquivo de teste com uma anotação especificando o mock.
Exemplo:
import 'package:mockito/annotations.dart';
@GenerateMocks([SearchRepository])
void main( ) {
}
e executar um comando no terminal: flutter pub run build_runner build.
Esse comando vai gerar um arquivo de mock na mesma pasta do arquivo de teste que pode ser importado no arquivo de teste.
Exemplo:
final repository = MockSearchRepository();
Pelo amor de Deus.
Preciso de ajuda. Estou há dois dias vasculhando a internet e quebrando a cabeça para resolver um problema e não consigo.
Estou brincando uma estrutura muito similar a essa, mas no caso teste que é para validar o retorno de uma lista de entidade, o repositório mock devolve para o use case sempre uma lista nula quando não era para ser.
Se alguém puder me ajudar eu agradeço:
A interface
Future searchTitle(String title);
O Mock
class DishRepositoryMock extends Mock implements IDishRepository {}
no main instancio
repository = DishRepositoryMock();
O Problema está nesse ponto:
test('title parameter searched', () async {
var listResult = dishList;
when(repository.searchTitle(any))
.thenAnswer((_) async => Right(listResult));
dishList é uma função que retorna uma lista de entidades Dish. No debbug está gerando certo. Só que o usecase chama o método Search mockado e devolve um null para a chamada abaixo.
var result = await searchUseCase.searchTitle("dish");
grato se alguém puder ajudar. Estou começando
manda la no discord ou telegram.
@@FlutterandoTV não estou conseguindo acessar o discord a verificação de e-mail da como já registrado
Abandonei pela quantidade de propaganda do RUclips. Se fizer um curso pago me avise
O RUclips está chato mesmo. Usa o RUclips Premium
Galera eu tenho uma duvida, talvez alguém possa me ajudar.
No caso da pasta entities, ele criou o "product", mas, caso eu estivesse em uma outra aplicação que tenha outros módulos (alem do search) e tivesse a necessidade de utilizar o "product" como seria essa comunicação.
Vlws!!
Vc pode criar um Modelo DTO, ou pode ler o proprio Product, o grande problema e que vc tera que ter um adapter ou Mapper, entao ´e melhor enviar um model que herde de sua entidade e que faca isso
Também tenho essa mesma dúvida. Em um projeto com várias features, tipo cliente, produto e pedido. A feature pedido precisa acessar os recursos do cliente e produto. Como se faria isso. Já pesquisei em todo lugar na internet e não achei a resposta.
Otima série, porém o link não ficou pinado do Either. O link seria este abaixo?
ruclips.net/video/QyH9UoHTeC8/видео.html
mals!! colocando lá!!
Tem como dar mais de um like?