1
votes

Afficher CircularProgressIndicator devant dans Flutter

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


2 commentaires

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?


4 Réponses :


1
votes

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()
                      )
                    ...
                   )


4 commentaires

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



0
votes

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é.


0 commentaires

5
votes

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(),
                );
              });
  }

Production:
entrez la description de l'image ici


0 commentaires

0
votes

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),
          ),
        );
      });
}


0 commentaires