Je veux afficher une barre circulaire comme le chargement devant d'autres widgets. Voici le code que j'utilise actuellement. Il montre le chargement circulaire mais c'est entre un autre widget.
Cela devrait être au top. Sur la base de la suggestion, j'ai essayé d'utiliser Stack mais il s'affiche toujours entre les widgets. Qu'est-ce que je fais de mal ici?
class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State<LoginPage> { bool visible = true ; //Testing purpose it is true. Actually it is false. @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, body: Stack( children: <Widget>[ new Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topRight, end: FractionalOffset.bottomCenter,//Alignment.bottomLeft, colors: [Colors.green[900], Colors.lightBlueAccent]), ), ),SingleChildScrollView( child: new Form( key: _formKey, autovalidate: _autoValidate, child: Center( child: Column( children: <Widget>[ Row( children: <Widget>[ VerticalText(), TextLogin(), ], ), Divider(), Container( width: 280, ), Container( width: 280, child: TextFormField( style: TextStyle( color: Colors.white, ), decoration: InputDecoration( border: InputBorder.none, hintText: 'Enter Email', fillColor: Colors.lightBlueAccent, labelText: 'Email', labelStyle: TextStyle( color: Colors.white70, fontSize: 20, ), ), controller: emailController, autocorrect: true, validator: validateEmail, onSaved: (String val) { _email = val; }, ) ), Container( width: 280, child: TextFormField( style: TextStyle( color: Colors.white, ), decoration: InputDecoration( border: InputBorder.none, hintText: 'Enter Password', fillColor: Colors.lightBlueAccent, labelText: 'Password', labelStyle: TextStyle( color: Colors.white70, fontSize: 20, ), ), controller: passwordController, autocorrect: true, obscureText: true, validator: validatePassword, onSaved: (String val) { _password = val; }, ) ), RaisedButton( onPressed: _validateInputs, color: Colors.green, textColor: Colors.white, padding: EdgeInsets.fromLTRB(10, 10, 10, 10), child: Text('Login'), ), Visibility( child: Center( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ SizedBox( child: CircularProgressIndicator( strokeWidth: 4.0, valueColor : AlwaysStoppedAnimation(Colors.white), ), height: 200.0, width: 200.0, ), ], ), ), visible: visible, ), ], ), ) ) ) ], ), ); }
J'ai vu des questions similaires dans SO, mais j'ai toujours du mal à les résoudre.
Comment travailler avec l'indicateur de progression en flutter?
flutter comment faire fonctionner un indicateur de progression circulaire
Flutter: créer une barre de progression de superposition
Comment afficher CircularProgressIndicator au-dessus de tous les widgets au centre de l'écran
4 Réponses :
Vous pouvez utiliser le widget Positioned
dans le widget de Stack
pour afficher CircularProgressIndicator
devant tous les widgets comme ci-dessous.
Veuillez mettre des valeurs en fonction de votre convenance dans les quatre valeurs en bas, à gauche, à droite, en haut ...
Positioned( bottom: , left: , right: , top : , child: Container( child : CircularProgressIndicator() ) ... )
Merci Jaimil. Je vais tester et confirmer. Voté.
Obtenir erorr. Les widgets positionnés doivent être placés directement à l'intérieur des widgets Stack.
Ouais, vous devriez placer le widget positionné dans la pile
Si cela résout votre problème, veuillez accepter ma réponse, alors un autre utilisateur peut en bénéficier
J'ai supprimé le code de Visiblity
avec celui-ci. Ancien code
return Scaffold( key: _scaffoldKey, body: Stack( children: <Widget>[ /////Some containers,child Widget etc///////// visible ? Container( color: Colors.black.withOpacity(0.5), child: Center( child:SizedBox(// Center( child: CircularProgressIndicator( strokeWidth: 4.0, valueColor : AlwaysStoppedAnimation(Colors.white), ), height: 200.0, width: 200.0, ), ), ) : Container() ] //Widget ), //Stack ); //Scaffold
Nouveau code
visible ? Container( color: Colors.black.withOpacity(0.5), child: Center( child:SizedBox(// Center( child: CircularProgressIndicator( strokeWidth: 4.0, valueColor : AlwaysStoppedAnimation(Colors.white), ), height: 200.0, width: 200.0, ), ), ) : Container()
Et surtout, il doit appeler le premier widget.
Visibility( child: Center( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ SizedBox( child: CircularProgressIndicator( strokeWidth: 4.0, valueColor : AlwaysStoppedAnimation(Colors.white), ), height: 200.0, width: 200.0, ), ], ), ), visible: visible, ),
Je ne suis pas sûr de l'avoir expliqué correctement ou non. Mais en bout de ligne, il ne devrait pas être à l'intérieur de l'autre widget enfant. Il doit être placé dans les premiers children: <Widget>[
pas à l'intérieur du fichier imbriqué.
La vraie signification de circularProgressIndicator est d'être exécuté pendant le chargement du processus sans laisser l'utilisateur l'interrompre.
Pour supprimer l'interruption par l'utilisateur entre les deux, il faut placer circularProgressIndicator dans une boîte de dialogue avec la propriété barrierDismissible: false
.
Il faut créer cet indicateur de chargement en tant que widget réutilisable.
Vous pouvez créer une méthode comme ci-dessous et l'utiliser n'importe où sur l'écran sans définir dans l'écran. (cela ne nécessite pas non plus de pile.). La boîte de dialogue apparaîtra au centre de l'écran.
void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Demo(), ); } } class Demo extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Circle Progress Indicator Demo"), ), body: Center( child: MaterialButton( child: Text("Press Me!"), onPressed: () => buildShowDialog(context), ), ), ); } buildShowDialog(BuildContext context) { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return Center( child: CircularProgressIndicator(), ); }); } }
Pour référence : code de paiement ci-dessous:
buildShowDialog(BuildContext context) { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return Center( child: CircularProgressIndicator(), ); }); }
Pour tous ceux qui veulent utiliser un LoadingIndicator flexible partout et qui veulent superposer l'écran actuel, il suffit de créer un fichier .dart contenant:
Navigator.of(context).pop();
Ensuite, vous pouvez l'utiliser n'importe où en utilisant
buildLoading(context);
et le rejeter une fois le chargement terminé en utilisant
import 'package:flutter/material.dart'; buildLoading(BuildContext context) { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return Center( child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation<Color>(Colors.blue), ), ); }); }
Je l'ai fait fonctionner. En fait, je dois le placer avant le dernier widget. Je vais mettre ma réponse
Avez-vous vérifié ma solution?