Adicionando uma tela inicial aos aplicativos Flutter
142
Como você abordaria a adição de uma tela inicial aos aplicativos Flutter? Ele deve carregar e exibir antes de qualquer outro conteúdo. Atualmente, há um breve flash de cor antes do carregamento do widget Andaime (home: X).
Não sei se é a maneira correta de adicionar uma tela inicial, definindo um timer personalizado. Não gosto de manter os processadores ociosos. Por que não fazer tarefas domésticas como verificar os arquivos ou diretórios necessários, sincronizar alguns logs ou fazer backup de alguns arquivos no No entanto, após todos os 3-4 segundos, leva muito tempo para um processador.
Quero trazer um pouco mais de luz sobre a maneira real de fazer uma tela inicial no Flutter.
Eu segui um pouco o rastreio aqui e vi que as coisas não estão tão ruins na tela inicial em Flutter.
Talvez a maioria dos desenvolvedores (como eu) esteja pensando que não há tela Splash por padrão no Flutter e precisem fazer algo sobre isso. Existe uma tela inicial, mas é com fundo branco e ninguém pode entender que já existe uma tela inicial para iOS e Android por padrão.
A única coisa que o desenvolvedor precisa fazer é colocar a imagem da marca no lugar certo e a tela inicial começará a funcionar assim.
Aqui está como você pode fazer isso passo a passo:
Primeiro no Android (porque é a minha plataforma favorita :))
Encontre a pasta "android" no seu projeto Flutter.
Navegue até a pasta app -> src -> main -> res e coloque todas as variantes da sua imagem de marca nas pastas correspondentes. Por exemplo:
a imagem com densidade 1 precisa ser colocada em mipmap-mdpi,
a imagem com densidade 1.5 precisa ser colocada em mipmap-hdpi,
a imagem com densidade 2 precisa ser colocada em mipmap-xdpi,
a imagem com densidade 3 precisa ser colocada em mipmap-xxdpi,
a imagem com densidade 4 precisa ser colocada em mipmap-xxxdpi,
Por padrão, na pasta android, não há drawable-mdpi, drawable-hdpi, etc., mas podemos criá-los se quisermos. Por esse motivo, as imagens precisam ser colocadas nas pastas mipmap. Além disso, o código XML padrão sobre a tela Splash (no Android) usará o @mipmap, em vez do recurso @drawable (você pode alterá-lo, se desejar).
A última etapa no Android é descomentar alguns dos códigos XML no arquivo drawable / launch_background.xml. Navegue até o aplicativo -> src -> principal -> res-> drawable e abra o launch_background.xml. Dentro deste arquivo, você verá por que o fundo da tela do Slash é branco. Para aplicar a imagem de marca que colocamos na etapa 2, precisamos descomentar alguns dos códigos XML do seu arquivo launch_background.xml. Após a alteração, o código deve se parecer com:
Por favor, preste atenção ao comentar o código XML do plano de fundo branco e descomentar o código da imagem do mipmap. Se alguém estiver interessado, o arquivo launch_background.xml será usado no arquivo styles.xml.
Segundo no iOS:
Encontre a pasta "ios" no seu projeto Flutter.
Vá para Runner -> Assets.xcassets -> LaunchImage.imageset. Deve haver LaunchImage.png, [email protected], etc. Agora você deve substituir essas imagens pelas variantes de imagem de marca. Por exemplo:
a imagem com densidade 1 precisa substituir LaunchImage.png,
Se não estou errado, [email protected] não existe por padrão, mas você pode criar um facilmente. Se [email protected] não existir, você também precisará declará-lo no arquivo Contents.json, que está no mesmo diretório que as imagens. Após a alteração, meu arquivo Contents.json se parece com o seguinte:
Isso deve ser tudo o que você precisa. Na próxima vez em que você executar o aplicativo, no Android ou iOS, você deverá ter a Tela Inicial correta com a imagem da marca que você adicionou.
Ocorreu um erro Cannot resolve symbol '@mipmap/ic_launcher'no Android Studio 3.1.1 (mesmo após a reconstrução do cache), no entanto, o aplicativo foi compilado e executado sem erros, e o gráfico do iniciador é exibido.
BNAI
1
Eu tenho o mesmo problema, no entanto, não posso executá-lo, pois em tempo de execução ele falha e me diz que a imagem está ausente. mas não pode resolver o mipmap por algum motivo. Alguém tem uma idéia do porquê disso?
Carlosx2
Olá pessoal, não sei por que você tem esse problema, mas para mim parece um problema de sincronização de projetos (não há outro motivo para não encontrar o recurso, se houver). Não sei como resolvê-lo porque nunca tive esse problema, mas tente sincronizar o projeto, limpar, reconstruir etc. o que for possível em sua IDÉIA. Tente também usar o recurso na pasta drawable e substitua a anotação mipmap pela anotação drawable. Estou apenas supondo agora :)
Stoycho Andreev
1
Curioso para saber por que você está adicionando a imagem 4x. O XCode parece esperar apenas 3x; existe um motivo para adicionar o 4x?
Eu sou o único a receber seus ícones na tela inicial e / ou na tela inicial ao atualizar os ícones? Usando este método exato ...?
31919 ChrisH
21
O Flutter, na verdade, oferece uma maneira mais simples de adicionar o Splash Screen ao nosso aplicativo. Primeiro, precisamos criar uma página básica à medida que projetamos outras telas de aplicativos. Você precisa torná-lo um StatefulWidget, pois o estado disso será alterado em alguns segundos.
Lógica
Dentro do initState () , chame um Timer () com a duração, como você deseja, eu fiz 3 segundos, uma vez feito, empurre o navegador para a tela inicial do nosso aplicativo.
Nota: O aplicativo deve mostrar a tela de apresentação apenas uma vez; o usuário não deve voltar para ela novamente ao pressionar o botão Voltar. Para isso, usamos Navigator.pushReplacement () , ele será movido para uma nova tela e removerá a tela anterior da pilha do histórico de navegação.
A tela inicial branca padrão ainda será exibida por mais de 1 segundo antes que essa tela personalizada seja exibida. Tem que substituir nos projetos xcode e android gerados para eliminá-lo.
D3vtoolsmith 22/03/19
Sim. A tela spalsh padrão no iOS e no Android sempre será exibida; essa tela de toque flutuante é uma adição a isso.
Mahesh Peri
A questão é que este exemplo não é confiável .... E se o seu aplicativo for carregado por mais de 3s devido a motivos como a conectividade de rede?
emanuel sanga 17/04
Para personalização adicional, eu apoio mais esta resposta. Quero primeiro executar uma solicitação HTTP enquanto exibe uma tela inicial. Essa abordagem foi muito mais fácil
Idris Stack
16
Ainda não há um bom exemplo disso, mas você pode fazê-lo usando as ferramentas nativas de cada plataforma:
Assine a edição 8147 para obter atualizações sobre o código de exemplo para telas de apresentação. Se o brilho preto entre a tela inicial e o aplicativo no iOS o incomodar, assine a edição 8127 para obter atualizações.
Editar: em 31 de agosto de 2017, o suporte aprimorado para telas iniciais está disponível no novo modelo de projeto. Veja # 11505 .
Eu descobri ... aparentemente a imagem do iOS estava ruim. O iOS e o ANDROID funcionam perfeitamente agora. alarme falso
IrishGringo 30/06
@SmrutiRanjanRana qual é o tamanho ideal para esta imagem?
Mattias
1
Esta resposta seria muito mais útil se houvesse um exemplo da localização da imagem. Caso contrário, o usuário precisará adivinhar como adicionar o caminho.
Adicione suas configurações ao arquivo pubspec.yaml do seu projeto ou crie um arquivo na pasta raiz do projeto denominada flutter_native_splash.yaml com suas configurações.
Você também pode usar # em cores. color: "# 42a5f5" Você também pode definir android ou ios como false se não quiser criar uma tela inicial para uma plataforma específica.
você pode postar o código completo (um código que podemos executar independentemente, sem a necessidade de definir nossas variáveis) ou um link no github?
Biniam
8
as pessoas que estão recebendo o erro como imagem não encontrada após aplicar a resposta verificada não se esqueça de adicionar @ mipmap / ic_launcher em vez de @ mipmap / ic_launcher.png
Seu IDE diria isso assim que você passasse o cursor sobre o erro
Ojonugwa Jude Ochalifu 25/06
7
@Collin Jackson e @Sniper estão certos. Você pode seguir estas etapas para configurar imagens de inicialização no Android e iOS, respectivamente. Em seu MyApp (), em seu initState (), você pode usar Future.delayed para configurar um timer ou chamar qualquer API. Até que a resposta seja retornada do futuro, seus ícones de inicialização serão mostrados e, à medida que a resposta chegar, você poderá ir para a tela que deseja acessar após a tela inicial. Você pode ver este link: Tela Flutter Splash
Para a tela inicial personalizada, crio diferentes resoluções de tela e adiciono as imagens iniciais na pasta mipmap conforme a resolução do Android.
A última parte é ajustar o launch_background.xml na pasta drawable na pasta res no Android.
Basta alterar seu código para se parecer com abaixo:
<?xml version="1.0" encoding="utf-8"?><!--Modifythis file to customize your launch splash screen --><layer-list xmlns:android="http://schemas.android.com/apk/res/android"><!--<item android:drawable="@android:color/white"/><item android:drawable="@drawable/<splashfilename>"/>-->--><!--You can insert your own image assets here --><item><bitmap
android:gravity="center"
android:src="@mipmap/<Your splash image name here as per the mipmap folder>"/></item></layer-list>
Poucos desenvolvedores que vi adicionaram o splash como desenhável, tentei isso, mas de alguma forma a compilação falha no Flutter 1.0.0 e no Dart SDK 2.0+. Portanto, eu prefiro adicionar o splash na seção bitmap.
A criação da tela inicial do iOS é bastante mais simples.
Na pasta Runner no iOS, atualize os arquivos LaunchImage.png com suas imagens de tela Splash personalizadas com os mesmos nomes que LaunchImage.png @ 2x, @ 3x, @ 4x.
Além disso, acho bom ter uma imagem 4x também no LaunchImage.imageset. Atualize seu código no Content.json com as seguintes linhas, abaixo da escala 3x para adicionar uma opção de escala 4x:
sim, exatamente, existem várias maneiras de fazer isso, mas na resposta, vou lhe dizer como você pode adicionar a tela inicial com a ajuda deste pacote pub.dev/packages/dynamic_theme
Champ 96k
4
Essa é a melhor maneira, sem erros, de adicionar uma tela inicial dinâmica no Flutter.
Corrigi o código que envolve o componente de consumidor do Navegador dentro de outro componente que inicializa o contexto do Navegador usando rotas, conforme mencionado neste artigo.
Você pode adicionar alguma explicação também? Um bloco de código simples por si só não é tudo o que informativo
CertainPerformance
3
Caso você queira uma tela inicial secundária (depois da nativa), aqui está um exemplo simples que funciona:
classSplashPageextendsStatelessWidget{SplashPage(BuildContext context){Future.delayed(constDuration(seconds:3),(){// Navigate here to next screen});}
@override
Widget build(BuildContext context){returnText('Splash screen here');}}
O Flutter fornece a capacidade de ter uma tela inicial por padrão, mas há muitos plug-ins que podem fazer o trabalho. Se você não deseja usar um plug-in para a tarefa e está preocupado que a adição de um novo plug-in possa afetar o tamanho do aplicativo. Então você pode fazer assim.
Para Android
Abra launch_background.xml e, em seguida, você pode inserir a imagem da tela inicial ou a cor gradiente desejada. Essa é a primeira coisa que seu usuário vê quando abre seu aplicativo.
Para IOS
Abra seu aplicativo usando o Xcode, clique em Runner> Assest.xcassets> LaunchImage, você pode adicionar a imagem aqui. Se você deseja editar qual posição a imagem da tela de inicialização deve assumir ou parecer, é possível editá-la no LaunchScreen.storyboard.
Aqui estão as etapas para configurar a tela inicial nas plataformas IOS e Android para seu aplicativo Flutter.
Plataforma IOS
Todos os aplicativos enviados à Apple App Store devem usar um storyboard do Xcode para fornecer a tela de inicialização do aplicativo. Vamos fazer isso em 3 etapas: -
Etapa 1 : abra o ios / Runner.xcworkspace na raiz do diretório do seu aplicativo.
Etapa 2 : Selecione Runner / Assets.xcassets no Project Navigator e arraste as imagens de inicialização de todos os tamanhos (2x, 3x, etc.). Você também pode gerar tamanhos diferentes de imagens em https://appicon.co/#image-sets
existe alguém enfrentando algum erro depois de codificar como este?
Use a sincronização com o sistema no android studio ou invalide o cache e redefina.
O Flutter.dev já fornece a melhor resposta, isso não é um bug nem um problema, apenas uma configuração. Basta ler um pouco e tudo será resolvido. Tenham um bom dia, pessoal.
Respostas:
Quero trazer um pouco mais de luz sobre a maneira real de fazer uma tela inicial no Flutter.
Eu segui um pouco o rastreio aqui e vi que as coisas não estão tão ruins na tela inicial em Flutter.
Talvez a maioria dos desenvolvedores (como eu) esteja pensando que não há tela Splash por padrão no Flutter e precisem fazer algo sobre isso. Existe uma tela inicial, mas é com fundo branco e ninguém pode entender que já existe uma tela inicial para iOS e Android por padrão.
A única coisa que o desenvolvedor precisa fazer é colocar a imagem da marca no lugar certo e a tela inicial começará a funcionar assim.
Aqui está como você pode fazer isso passo a passo:
Primeiro no Android (porque é a minha plataforma favorita :))
Encontre a pasta "android" no seu projeto Flutter.
Navegue até a pasta app -> src -> main -> res e coloque todas as variantes da sua imagem de marca nas pastas correspondentes. Por exemplo:
Por padrão, na pasta android, não há drawable-mdpi, drawable-hdpi, etc., mas podemos criá-los se quisermos. Por esse motivo, as imagens precisam ser colocadas nas pastas mipmap. Além disso, o código XML padrão sobre a tela Splash (no Android) usará o @mipmap, em vez do recurso @drawable (você pode alterá-lo, se desejar).
A última etapa no Android é descomentar alguns dos códigos XML no arquivo drawable / launch_background.xml. Navegue até o aplicativo -> src -> principal -> res-> drawable e abra o launch_background.xml. Dentro deste arquivo, você verá por que o fundo da tela do Slash é branco. Para aplicar a imagem de marca que colocamos na etapa 2, precisamos descomentar alguns dos códigos XML do seu arquivo launch_background.xml. Após a alteração, o código deve se parecer com:
Por favor, preste atenção ao comentar o código XML do plano de fundo branco e descomentar o código da imagem do mipmap. Se alguém estiver interessado, o arquivo launch_background.xml será usado no arquivo styles.xml.
Segundo no iOS:
Encontre a pasta "ios" no seu projeto Flutter.
Vá para Runner -> Assets.xcassets -> LaunchImage.imageset. Deve haver LaunchImage.png, [email protected], etc. Agora você deve substituir essas imagens pelas variantes de imagem de marca. Por exemplo:
Se não estou errado, [email protected] não existe por padrão, mas você pode criar um facilmente. Se [email protected] não existir, você também precisará declará-lo no arquivo Contents.json, que está no mesmo diretório que as imagens. Após a alteração, meu arquivo Contents.json se parece com o seguinte:
Isso deve ser tudo o que você precisa. Na próxima vez em que você executar o aplicativo, no Android ou iOS, você deverá ter a Tela Inicial correta com a imagem da marca que você adicionou.
obrigado
fonte
Cannot resolve symbol '@mipmap/ic_launcher'
no Android Studio 3.1.1 (mesmo após a reconstrução do cache), no entanto, o aplicativo foi compilado e executado sem erros, e o gráfico do iniciador é exibido.Se você
flutter create
criou seu projeto, pode seguir as etapas em https://flutter.io/assets-and-images/#updating-the-launch-screen .fonte
O Flutter, na verdade, oferece uma maneira mais simples de adicionar o Splash Screen ao nosso aplicativo. Primeiro, precisamos criar uma página básica à medida que projetamos outras telas de aplicativos. Você precisa torná-lo um StatefulWidget, pois o estado disso será alterado em alguns segundos.
Lógica Dentro do initState () , chame um Timer () com a duração, como você deseja, eu fiz 3 segundos, uma vez feito, empurre o navegador para a tela inicial do nosso aplicativo.
Nota: O aplicativo deve mostrar a tela de apresentação apenas uma vez; o usuário não deve voltar para ela novamente ao pressionar o botão Voltar. Para isso, usamos Navigator.pushReplacement () , ele será movido para uma nova tela e removerá a tela anterior da pilha do histórico de navegação.
Para uma melhor compreensão, visite Flutter: crie sua própria tela inicial
fonte
Ainda não há um bom exemplo disso, mas você pode fazê-lo usando as ferramentas nativas de cada plataforma:
iOS: https://docs.nativescript.org/publishing/creating-launch-screens-ios
Android: https://www.bignerdranch.com/blog/splash-screens-the-right-way/
Assine a edição 8147 para obter atualizações sobre o código de exemplo para telas de apresentação. Se o brilho preto entre a tela inicial e o aplicativo no iOS o incomodar, assine a edição 8127 para obter atualizações.
Editar: em 31 de agosto de 2017, o suporte aprimorado para telas iniciais está disponível no novo modelo de projeto. Veja # 11505 .
fonte
Para Android, acesse android> app> src> main> res> drawable> launcher_background.xml
Agora remova o comentário e substitua @ mipmap / launch_image pela localização da sua imagem.
Você pode alterar a cor da sua tela aqui -
fonte
A maneira mais fácil de adicionar uma tela inicial no flutter é usando este pacote: https://pub.dev/packages/flutter_native_splash
Guia de instalação (pelo autor do pacote):
1. Configurando a tela inicial
Adicione suas configurações ao arquivo pubspec.yaml do seu projeto ou crie um arquivo na pasta raiz do projeto denominada flutter_native_splash.yaml com suas configurações.
a imagem deve ser um arquivo png.
Você também pode usar # em cores. color: "# 42a5f5" Você também pode definir android ou ios como false se não quiser criar uma tela inicial para uma plataforma específica.
Caso sua imagem use toda a tela disponível (largura e altura), você pode usar a propriedade fill.
Nota: a propriedade fill ainda não foi implementada para telas de apresentação do iOS.
Se você deseja desativar a tela inicial de tela cheia no Android, pode usar a propriedade android_disable_fullscreen.
2. Execute o pacote
Após adicionar suas configurações, execute o pacote com
flutter pub pub run flutter_native_splash:create
Quando o pacote terminar de executar, a tela inicial estará pronta.fonte
Você deve tentar o código abaixo, trabalhou para mim
fonte
as pessoas que estão recebendo o erro como imagem não encontrada após aplicar a resposta verificada não se esqueça de adicionar @ mipmap / ic_launcher em vez de @ mipmap / ic_launcher.png
fonte
@Collin Jackson e @Sniper estão certos. Você pode seguir estas etapas para configurar imagens de inicialização no Android e iOS, respectivamente. Em seu MyApp (), em seu initState (), você pode usar Future.delayed para configurar um timer ou chamar qualquer API. Até que a resposta seja retornada do futuro, seus ícones de inicialização serão mostrados e, à medida que a resposta chegar, você poderá ir para a tela que deseja acessar após a tela inicial. Você pode ver este link: Tela Flutter Splash
fonte
Adicionar uma página como abaixo e rotear pode ajudar
Se você quiser seguir em frente, consulte: https://www.youtube.com/watch?v=FNBuo-7zg2Q
fonte
Várias maneiras de fazer isso, mas a mais fácil que eu uso é:
Para os Ícones de inicialização, uso a biblioteca do flutter Ícone do Flutter Launcher
Para a tela inicial personalizada, crio diferentes resoluções de tela e adiciono as imagens iniciais na pasta mipmap conforme a resolução do Android.
A última parte é ajustar o launch_background.xml na pasta drawable na pasta res no Android.
Basta alterar seu código para se parecer com abaixo:
Poucos desenvolvedores que vi adicionaram o splash como desenhável, tentei isso, mas de alguma forma a compilação falha no Flutter 1.0.0 e no Dart SDK 2.0+. Portanto, eu prefiro adicionar o splash na seção bitmap.
A criação da tela inicial do iOS é bastante mais simples.
Na pasta Runner no iOS, atualize os arquivos LaunchImage.png com suas imagens de tela Splash personalizadas com os mesmos nomes que LaunchImage.png @ 2x, @ 3x, @ 4x.
Além disso, acho bom ter uma imagem 4x também no LaunchImage.imageset. Atualize seu código no Content.json com as seguintes linhas, abaixo da escala 3x para adicionar uma opção de escala 4x:
fonte
faça o seu material App como este
=> Adicionar dependência
=> import import 'pacote: splashscreen / splashscreen.dart';
A saída final da tela assim pode ser alterada em segundo, de acordo com suas necessidades, o círculo será redondo circular
fonte
Essa é a melhor maneira, sem erros, de adicionar uma tela inicial dinâmica no Flutter.
MAIN.DART
SPLASHSCREEN.DART
CONSTANTS.DART
HOMESCREEN.DART
fonte
O código de Jaldhi Bhatt não funciona para mim.
O Flutter lança uma ' operação do Navegador solicitada com um contexto que não inclui um Navegador '.
Corrigi o código que envolve o componente de consumidor do Navegador dentro de outro componente que inicializa o contexto do Navegador usando rotas, conforme mencionado neste artigo.
fonte
Caso você queira uma tela inicial secundária (depois da nativa), aqui está um exemplo simples que funciona:
fonte
O Flutter fornece a capacidade de ter uma tela inicial por padrão, mas há muitos plug-ins que podem fazer o trabalho. Se você não deseja usar um plug-in para a tarefa e está preocupado que a adição de um novo plug-in possa afetar o tamanho do aplicativo. Então você pode fazer assim.
Para Android
Abra launch_background.xml e, em seguida, você pode inserir a imagem da tela inicial ou a cor gradiente desejada. Essa é a primeira coisa que seu usuário vê quando abre seu aplicativo.
Para IOS
Abra seu aplicativo usando o Xcode, clique em Runner> Assest.xcassets> LaunchImage, você pode adicionar a imagem aqui. Se você deseja editar qual posição a imagem da tela de inicialização deve assumir ou parecer, é possível editá-la no LaunchScreen.storyboard.
fonte
Aqui estão as etapas para configurar a tela inicial nas plataformas IOS e Android para seu aplicativo Flutter.
Plataforma IOS
Todos os aplicativos enviados à Apple App Store devem usar um storyboard do Xcode para fornecer a tela de inicialização do aplicativo. Vamos fazer isso em 3 etapas: -
Etapa 1 : abra o ios / Runner.xcworkspace na raiz do diretório do seu aplicativo.
Etapa 2 : Selecione Runner / Assets.xcassets no Project Navigator e arraste as imagens de inicialização de todos os tamanhos (2x, 3x, etc.). Você também pode gerar tamanhos diferentes de imagens em https://appicon.co/#image-sets
Etapa 3 : você pode ver o arquivo LaunchScreen.storyboard mostrando a imagem fornecida. Aqui também é possível alterar a posição da imagem, arrastando-a. Para obter mais informações, consulte a documentação oficial https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen/
Plataforma Android
No Android, uma tela de inicialização é exibida enquanto o aplicativo Android é inicializado. Vamos definir esta tela de inicialização em 3 etapas: -
Etapa 1 : Abra o arquivo android / app / src / main / res / drawable / launch_background.xml.
Etapa 2 : na linha número 4, você pode selecionar a cor desejada: -
Etapa 3 : na linha número 10, você pode alterar a imagem: -
Isso é tudo, você está pronto! Happy Coding :)
fonte
Para o
aplicativo Android -> src -> principal -> res -> drawble-> launch_background.xml e descomente o bloco comentado como este
existe alguém enfrentando algum erro depois de codificar como este?
Use a sincronização com o sistema no android studio ou invalide o cache e redefina.
fonte
O Flutter.dev já fornece a melhor resposta, isso não é um bug nem um problema, apenas uma configuração. Basta ler um pouco e tudo será resolvido. Tenham um bom dia, pessoal.
https://flutter.dev/docs/development/ui/advanced/splash-screen
fonte
Você pode criá-lo de duas maneiras
Encontrei uma explicação completa para remover a tela branca e exibir a tela inicial aqui
fonte
fonte