Ajouter un écran de projection pour Flutter les applications
comment vous approcheriez en ajoutant un splash screen
pour Flutter apps
? Il devrait charger et afficher avant tout autre contenu. Actuellement, il ya un bref flash de couleur avant l'Échafaudage(accueil: X
) charges widget.
9 réponses
je veux apporter plus de lumière à la façon actuelle de faire éclaboussure écran dans Flutter.
j'ai suivi un peu la trace ici et j'ai vu que les choses ne sont pas si mal à propos de L'écran de projection dans Flutter.
peut-être que la plupart des devs (comme moi) pensent qu'il n'y a pas D'écran de projection par défaut dans Flutter et ils doivent faire quelque chose à ce sujet. En fait, il ya Splash écran, mais il est avec blanc fond et personne ne peut comprendre qu'il ya déjà splash écran pour iOS et Android par défaut.
c'est en fait cool, parce que la seule chose que le développeur doit faire est de mettre l'image de marque sur le bon endroit et l'écran de projection va commencer à fonctionner juste comme cela.
maintenant voici comment cela peut être fait, étape par étape:
premier pour Android (parce que c'est ma plate-forme préférée :) )
-
trouvez le dossier" android " dans votre projet Flutter.
-
Parcourir app -> src - > > - > dossier res et toutes les variantes de votre image de marque dans les dossiers correspondants. Par exemple:
- l'image avec Densité 1 doit être placée dans mipmap-mdpi,
- l'image avec densité 1.5 doit être placée en mipmap-hdpi,
- l'image avec densité 2 doit être placée dans mipmap-xdpi,
- l'image avec densité 3 doit être placée dans mipmap-xxdpi,
- l'image avec densité 4 doit être placée dans mipmap-xxxdpi,
par défaut pour le dossier android il n'y a pas de drawable-mdpi, drawable-hdpi etc. mais tout le monde peut créer si il veut. C'est pourquoi les images doivent être placées dans les dossiers mipmap. De plus, le code XML par défaut sur L'écran Splash (dans Android) va avoir un look dans @mipmap pas dans @drawable (vous pouvez le changer si vous voulez).
-
la dernière étape dans Android est de décompresser un peu de code dans drawable/launch_background.XML. Passez en revue l'application - > src - > main - > res - > drawable et open launch_background.XML. À l'intérieur de ce fichier, vous verrez pourquoi le fond de L'écran Slash est blanc. Pour appliquer l'image de marque que nous avons placé à l'étape 2, nous devons décommenter une partie du code XML dans votre launch_background.fichier xml, donc après le changement le code devrait ressembler à:
<!--<item android:drawable="@android:color/white" />--> <item> <bitmap android:gravity="center" android:src="@mipmap/your_image_name" /> </item>
faites attention que nous commencions le code de fond blanc et décomment le code à propos de l'image mipmap. Si quelqu'un est intéressé, ce launch_background.xml est utilisé dans les styles.fichier xml.
maintenant pour iOS:
-
trouvez le dossier" ios " dans votre projet Flutter.
-
parcourir vers Runner -> Assets.xcassets - > LaunchImage.imageset. Il devrait y avoir LaunchImage.png, LaunchImage@2x.png etc. Maintenant, vous devez remplacer ces images par des variantes d'image de marque. Par exemple:
- l'image avec Densité 1 doit avoir priorité LaunchImage.png,
- l'image avec densité 2 doit être écrasée LaunchImage@2x.png,
- l'image avec densité 3 doit être écrasée LaunchImage@3x.png,
- l'image avec la densité 4 doit être écrasée LaunchImage@4x.png,
si je n'ai pas tort LaunchImage@4x.png n'existe pas par défaut, mais vous pouvez facilement en créer un. Si LaunchImage@4x.png ça n'existe pas, toi. avoir à les déclarer dans le Contenu.fichier json, qui est dans le même répertoire comme les images. Après le changement de contenu.le fichier json ressemble à ceci:
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@4x.png",
"scale" : "4x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
et c'est tout. La prochaine fois que vous lancez votre application, sur Android et iOS, vous devriez avoir le bon écran Splash avec l'image de marque que vous avez ajouté.
Merci
il n'y a pas encore un bon exemple de cela, mais vous pouvez le faire vous-même en utilisant les outils natifs pour chaque plate-forme:
iOS: https://docs.nativescript.org/publishing/creating-launch-screens-ios
Android: https://www.bignerdranch.com/blog/splash-screens-the-right-way /
abonnez-vous à numéro 8147 pour les mises à jour sur le code exemple pour splash écran. Si le clignotant noir entre l'écran de projection et l'application sur iOS vous dérange, abonnez à numéro 8127 pour les mises à jour.
Edit: depuis le 31 août 2017, un support amélioré pour les écrans anti-éclaboussures est maintenant disponible dans le nouveau modèle de projet. Voir #11505 .
, Vous devriez essayer de code ci-dessous, travaillé pour moi
import 'dart:async';
import 'package:attendance/components/appbar.dart';
import 'package:attendance/homepage.dart';
import 'package:flutter/material.dart';
class _SplashScreenState extends State<SplashScreen>
with SingleTickerProviderStateMixin {
void handleTimeout() {
Navigator.of(context).pushReplacement(new MaterialPageRoute(
builder: (BuildContext context) => new MyHomePage()));
}
startTimeout() async {
var duration = const Duration(seconds: 3);
return new Timer(duration, handleTimeout);
}
@override
void initState() {
// TODO: implement initState
super.initState();
_iconAnimationController = new AnimationController(
vsync: this, duration: new Duration(milliseconds: 2000));
_iconAnimation = new CurvedAnimation(
parent: _iconAnimationController, curve: Curves.easeIn);
_iconAnimation.addListener(() => this.setState(() {}));
_iconAnimationController.forward();
startTimeout();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Scaffold(
body: new Center(
child: new Image(
image: new AssetImage("images/logo.png"),
width: _iconAnimation.value * 100,
height: _iconAnimation.value * 100,
)),
),
);
}
}
si vous flutter create
d votre projet, vous pouvez suivre les étapes à https://flutter.io/assets-and-images/#updating-the-launch-screen .
les deux @Collin Jackson et @Sniper ont raison. Vous pouvez suivre ces étapes pour configurer les images de lancement dans android et iOS respectivement. Puis dans votre MyApp(), dans votre initState(), vous pouvez utiliser Avenir.retard pour configurer une minuterie ou appeler une api. Jusqu'à ce que la réponse est renvoyée de l'Avenir, vos icônes de lancement sera montré que la réponse venir, vous pouvez passer à l'écran que vous voulez aller à après l'écran de démarrage. Vous pouvez voir ce lien : Scintillement de l'Écran de démarrage
pour Android, Allez à android > app > src > main > res > drawable > launcher_background.xml
décommentez maintenant ceci et remplacez @mipmap/launch_image , par votre emplacement d'image.
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item>
vous pouvez changer la couleur de votre écran ici -
<item android:drawable="@android:color/white" />
ajouter une page comme ci-dessous et le routage pourrait aider
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutkart/utils/flutkart.dart';
import 'package:flutkart/utils/my_navigator.dart';
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
Timer(Duration(seconds: 5), () => MyNavigator.goToIntro(context));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
fit: StackFit.expand,
children: <Widget>[
Container(
decoration: BoxDecoration(color: Colors.redAccent),
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Expanded(
flex: 2,
child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircleAvatar(
backgroundColor: Colors.white,
radius: 50.0,
child: Icon(
Icons.shopping_cart,
color: Colors.greenAccent,
size: 50.0,
),
),
Padding(
padding: EdgeInsets.only(top: 10.0),
),
Text(
Flutkart.name,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 24.0),
)
],
),
),
),
Expanded(
flex: 1,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(),
Padding(
padding: EdgeInsets.only(top: 20.0),
),
Text(
Flutkart.store,
softWrap: true,
textAlign: TextAlign.center,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18.0,
color: Colors.white),
)
],
),
)
],
)
],
),
);
}
}
si vous voulez poursuivre, voir: https://www.youtube.com/watch?v=FNBuo-7zg2Q
les personnes qui obtiennent l'erreur comme l'image non trouvée après avoir appliqué la réponse vérifiée s'assurent que vous ajoutez @mipmap/ic_launcher au lieu de @mipmap/ ic_launcher.png
le code de Jaldhi Bhatt ne marche pas pour moi.
Flutter lance un ' navigation demandée avec un contexte qui ne comprend pas un navigateur .
j'ai fixé le code enveloppant le composant consommateur Navigator à l'intérieur d'un autre composant qui initialise le contexte Navigator en utilisant des routes, comme mentionné dans cet" article .
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:my-app/view/main-view.dart';
class SplashView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: Builder(
builder: (context) => new _SplashContent(),
),
routes: <String, WidgetBuilder>{
'/main': (BuildContext context) => new MainView()}
);
}
}
class _SplashContent extends StatefulWidget{
@override
_SplashContentState createState() => new _SplashContentState();
}
class _SplashContentState extends State<_SplashContent>
with SingleTickerProviderStateMixin {
var _iconAnimationController;
var _iconAnimation;
startTimeout() async {
var duration = const Duration(seconds: 3);
return new Timer(duration, handleTimeout);
}
void handleTimeout() {
Navigator.pushReplacementNamed(context, "/main");
}
@override
void initState() {
super.initState();
_iconAnimationController = new AnimationController(
vsync: this, duration: new Duration(milliseconds: 2000));
_iconAnimation = new CurvedAnimation(
parent: _iconAnimationController, curve: Curves.easeIn);
_iconAnimation.addListener(() => this.setState(() {}));
_iconAnimationController.forward();
startTimeout();
}
@override
Widget build(BuildContext context) {
return new Center(
child: new Image(
image: new AssetImage("images/logo.png"),
width: _iconAnimation.value * 100,
height: _iconAnimation.value * 100,
)
);
}
}