स्पंदन में प्रगति संकेतक के साथ कैसे काम करें?


86

मैं स्पंदन में नौसिखिया हूं और जानना चाहता हूं कि CircularProgressIndicatorमेरे लेआउट में जोड़ने का बेहतर तरीका क्या है । उदाहरण के लिए, मेरा लॉगिन दृश्य। इस दृश्य में उपयोगकर्ता नाम, पासवर्ड और लॉगिन बटन है। मैं एक ओवरले लेआउट (के साथ Opacity) बनाना चाहता था कि, जब लोड हो रहा हो, तो प्रगति सूचक को दिखाएँ जैसे कि मैं नेटिवस्क्रिप्ट में उपयोग करता हूं, लेकिन मैं थोड़ा भ्रमित हूं कि कैसे करना है और अगर यह बेहतर तरीका है। NativeScript पर, उदाहरण के लिए, मैं मुख्य लेआउट में संकेतक सक्रियता जोड़ता हूं और सही या गलत में व्यस्त हूं, इसलिए यह लोड होने पर सभी दृश्य घटकों को ओवरले करता है।

संपादित करें:

मैं इस परिणाम तक पहुंचने में सक्षम था:

    void main() {
      runApp(new MyApp());
    }

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Flutter Demo',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }

    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);

      final String title;

      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }

    class _MyHomePageState extends State<MyHomePage> {
      bool _loading = false;

      void _onLoading() {
        setState(() {
          _loading = true;
          new Future.delayed(new Duration(seconds: 3), _login);
        });
      }


      Future _login() async{
        setState((){
          _loading = false;
        });
      }

      @override
      Widget build(BuildContext context) {


          var body = new Column(
              children: <Widget>[
                new Container(
                  height: 40.0,
                  padding: const EdgeInsets.all(10.0),
                  margin: const EdgeInsets.fromLTRB(15.0, 150.0, 15.0, 0.0),
                  decoration: new BoxDecoration(
                    color: Colors.white,
                  ),
                  child: new TextField(
                    decoration: new InputDecoration.collapsed(hintText: "username"),
                  ),
                ),
                new Container(
                  height: 40.0,
                  padding: const EdgeInsets.all(10.0),
                  margin: const EdgeInsets.all(15.0),
                  decoration: new BoxDecoration(
                    color: Colors.white,
                  ),
                  child: new TextField(
                    decoration: new InputDecoration.collapsed(hintText: "password"),
                  ),
                ),
              ],
            );


          var bodyProgress = new Container(
            child: new Stack(
              children: <Widget>[
                body,
                new Container(
                  alignment: AlignmentDirectional.center,
                  decoration: new BoxDecoration(
                    color: Colors.white70,
                  ),
                  child: new Container(
                    decoration: new BoxDecoration(
                      color: Colors.blue[200],
                      borderRadius: new BorderRadius.circular(10.0)
                    ),
                    width: 300.0,
                    height: 200.0,
                    alignment: AlignmentDirectional.center,
                    child: new Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        new Center(
                          child: new SizedBox(
                            height: 50.0,
                            width: 50.0,
                            child: new CircularProgressIndicator(
                              value: null,
                              strokeWidth: 7.0,
                            ),
                          ),
                        ),
                        new Container(
                          margin: const EdgeInsets.only(top: 25.0),
                          child: new Center(
                            child: new Text(
                              "loading.. wait...",
                              style: new TextStyle(
                                color: Colors.white
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ],
            ),
          );

          return new Scaffold(
            appBar: new AppBar(
              title: new Text(widget.title),
            ),
            body: new Container(
              decoration: new BoxDecoration(
                color: Colors.blue[200]
              ),
              child: _loading ? bodyProgress : body
            ),
            floatingActionButton: new FloatingActionButton(
              onPressed: _onLoading,
              tooltip: 'Loading',
              child: new Icon(Icons.check),
            ),
          );
      }
    }

एप्लिकेशन स्क्रीन परिणाम

मैं अभी भी राज्यों के विचार के अनुकूल हूं। स्पंदन के साथ काम करने पर यह कोड अपेक्षित है?

धन्यवाद!


1
डायलॉग दिखाते समय बैकप्रेस्ड को कैसे निष्क्रिय करें?
त्वरित शिक्षार्थी

जवाबों:


77

स्पंदन में, एसिंक्रोनस कार्यों से निपटने के कुछ तरीके हैं।

यह करने के लिए एक आलसी तरीका एक मोडल का उपयोग किया जा सकता है। जो उपयोगकर्ता इनपुट को अवरुद्ध करेगा, इस प्रकार किसी भी अवांछित कार्यों को रोक देगा। इसके लिए आपके कोड में बहुत कम परिवर्तन की आवश्यकता होगी। बस _onLoadingकुछ इस तरह से अपने संशोधन :

void _onLoading() {
  showDialog(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return Dialog(
        child: new Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            new CircularProgressIndicator(),
            new Text("Loading"),
          ],
        ),
      );
    },
  );
  new Future.delayed(new Duration(seconds: 3), () {
    Navigator.pop(context); //pop dialog
    _login();
  });
}

इसका उपयोग करने का सबसे आदर्श तरीका FutureBuilderऔर एक स्टेटफुल विजेट है। जो आपने शुरू किया है। चाल यह है कि, boolean loading = falseअपने राज्य में होने के बजाय , आप सीधे एक का उपयोग कर सकते हैंFuture<MyUser> user

और फिर इसे तर्क के रूप में पास करें FutureBuilder, जो आपको कुछ जानकारी देगा जैसे कि "हैडटा" या MyUserजब पूरा होने का उदाहरण है ।

यह इस तरह से कुछ करने के लिए नेतृत्व करेंगे:

@immutable
class MyUser {
  final String name;

  MyUser(this.name);
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<MyUser> user;

  void _logIn() {
    setState(() {
      user = new Future.delayed(const Duration(seconds: 3), () {
        return new MyUser("Toto");
      });
    });
  }

  Widget _buildForm(AsyncSnapshot<MyUser> snapshot) {
    var floatBtn = new RaisedButton(
      onPressed:
          snapshot.connectionState == ConnectionState.none ? _logIn : null,
      child: new Icon(Icons.save),
    );
    var action =
        snapshot.connectionState != ConnectionState.none && !snapshot.hasData
            ? new Stack(
                alignment: FractionalOffset.center,
                children: <Widget>[
                  floatBtn,
                  new CircularProgressIndicator(
                    backgroundColor: Colors.red,
                  ),
                ],
              )
            : floatBtn;

    return new ListView(
      padding: const EdgeInsets.all(15.0),
        children: <Widget>[
          new ListTile(
            title: new TextField(),
          ),
          new ListTile(
            title: new TextField(obscureText: true),
          ),
          new Center(child: action)
        ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return new FutureBuilder(
      future: user,
      builder: (context, AsyncSnapshot<MyUser> snapshot) {
        if (snapshot.hasData) {
          return new Scaffold(
            appBar: new AppBar(
              title: new Text("Hello ${snapshot.data.name}"),
            ),
          );
        } else {
          return new Scaffold(
            appBar: new AppBar(
              title: new Text("Connection"),
            ),
            body: _buildForm(snapshot),
          );
        }
      },
    );
  }
}

1
कूल, दोनों उदाहरण लॉगिन और अन्य स्थितियों पर उपयोगी होंगे। संवाद के साथ हैंडलर की प्रगति मेरे संस्करण से बेहतर दिखती है और FutureBuilder यह मेरे समाधान से भी अधिक सुंदर है। मदद के लिए शुक्रिया!
रिकार्डो बोच्ची

विषय से एक प्रश्न .. प्रत्येक TextField के लिए मुझे एक TextEditingController अद्वितीय की आवश्यकता है?
रिकार्डो बोच्ची

@ रिकाडार्बोचची हां
अजीजा

मुझे नहीं लगता कि डायलॉग वास्तविक उदाहरण के साथ काम करेगा, यह भ्रमित कर रहा है कि _login () वापस आने के बाद उपयोगकर्ता को कैसे पुनर्निर्देशित किया जाएगा। आपका दूसरा उदाहरण हालांकि अधिक सुविधाजनक लगता है। अच्छी तरह से पके हुए।
aziza

1
खैर, संवाद कार्यात्मक है और उसके मूल कोड में बहुत कम संशोधन की आवश्यकता है। उदाहरण के लिए वह डायलॉग को बंद कर सकता है Navigator.pushNamed("/home")
रेमी रूसेलेट

38

मेरे लिए, ऐसा करने का एक साफ-सुथरा तरीका यह है SnackBarकि साइन-इन की प्रक्रिया पूरी होने के बाद नीचे की तरफ दिखाया जाए , इसका एक उदाहरण है कि मेरा क्या मतलब है:

यहां छवि विवरण दर्ज करें

यहाँ कैसे सेटअप करने के लिए है SnackBar

अपने लिए एक वैश्विक कुंजी निर्धारित करें Scaffold

final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

इसे अपनी Scaffold keyविशेषता में जोड़ें

return new Scaffold(
      key: _scaffoldKey,
.......

मेरा साइन इन करें बटन onPressedकॉलबैक:

onPressed: () {
                  _scaffoldKey.currentState.showSnackBar(
                      new SnackBar(duration: new Duration(seconds: 4), content:
                      new Row(
                        children: <Widget>[
                          new CircularProgressIndicator(),
                          new Text("  Signing-In...")
                        ],
                      ),
                      ));
                  _handleSignIn()
                      .whenComplete(() =>
                      Navigator.of(context).pushNamed("/Home")
                  );
                }

यह वास्तव में इस बात पर निर्भर करता है कि आप अपने लेआउट का निर्माण कैसे करना चाहते हैं, और मुझे यकीन नहीं है कि आपके पास क्या है।

संपादित करें

आप शायद इसे इस तरह से चाहते हैं, मैंने इस परिणाम को प्राप्त करने के लिए एक स्टैक का उपयोग किया है और बस अपने संकेतक को दिखाने या छिपाने के लिए उपयोग किया है onPressed

यहां छवि विवरण दर्ज करें

class TestSignInView extends StatefulWidget {
  @override
  _TestSignInViewState createState() => new _TestSignInViewState();
}


class _TestSignInViewState extends State<TestSignInView> {
  bool _load = false;
  @override
  Widget build(BuildContext context) {
    Widget loadingIndicator =_load? new Container(
      color: Colors.grey[300],
      width: 70.0,
      height: 70.0,
      child: new Padding(padding: const EdgeInsets.all(5.0),child: new Center(child: new CircularProgressIndicator())),
    ):new Container();
    return new Scaffold(
      backgroundColor: Colors.white,
      body:  new Stack(children: <Widget>[new Padding(
        padding: const EdgeInsets.symmetric(vertical: 50.0, horizontal: 20.0),
        child: new ListView(

          children: <Widget>[
            new Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center
              ,children: <Widget>[
            new TextField(),
            new TextField(),

            new FlatButton(color:Colors.blue,child: new Text('Sign In'),
                onPressed: () {
              setState((){
                _load=true;
              });

                  //Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new HomeTest()));
                }
            ),

            ],),],
        ),),
        new Align(child: loadingIndicator,alignment: FractionalOffset.center,),

      ],));
  }

}

नमस्ते, यह वही है जो मैं करना चाहता था, लेकिन मुझे वह लेआउट नहीं मिल रहा था जिसकी मुझे आवश्यकता थी। ढेर जवाब है। StatefulWidget के बारे में, क्या प्रगति की स्थिति बदलने पर यह सभी दृश्य सही है?
रिकार्डो बोच्ची

अरे, मुझे आपका सवाल समझ नहीं आ रहा है?
अज़ीज़ा

मेरे कोड में, जब _loadingपरिवर्तन होता है, तो सभी दृश्य पुनर्निर्माण होते हैं। ऐसा क्या?
रिकार्डो बोच्ची

1
एक मोडल का उपयोग करना शायद एक ही समय में बहुत आसान और अधिक सहज है। आप केवल भीख मांगने या अपने अनुरोध पर एक लोडिंग संवाद को आगे बढ़ा सकते हैं और समाप्त होने पर इसे पॉप कर सकते हैं। यह आगे उपयोगकर्ता इनपुट को रोकने का भी लाभ है।
रेमी रूसेलेट

2
ओके, मुझे कुछ बेक करने दो।
रेमी रूसेलेट

34

एक बूल बनाएं isLoadingऔर इसे सेट करें false। त्रिगुट ऑपरेटर की मदद के साथ, जब की प्रवेश बटन सेट स्थिति पर उपयोगकर्ता क्लिक isLoadingकरने के लिए true। आपको लॉगिन बटन के स्थान पर परिपत्र लोडिंग संकेतक मिलेगा

 isLoading ? new PrimaryButton(
                      key: new Key('login'),
                      text: 'Login',
                      height: 44.0,
                      onPressed: setState((){isLoading = true;}))
                  : Center(
                      child: CircularProgressIndicator(),
                    ),

आप स्क्रीनशॉट देख सकते हैं कि लॉगिन पर क्लिक करने से पहले यह कैसा दिखता है यहां छवि विवरण दर्ज करें

लॉगिन करने के बाद क्लिक किया जाता है यहां छवि विवरण दर्ज करें

मतलब समय में आप लॉगिन प्रक्रिया और लॉगिन उपयोगकर्ता चला सकते हैं। उपयोगकर्ता प्रमाणिकता उसके बाद फिर से गलत हैं, तो आप करेंगे setStateके isLoadingलिए false, ऐसा है कि लोड हो रहा है सूचक अदृश्य और प्रवेश बटन उपयोगकर्ता के लिए दृश्यमान हो जाएगा। वैसे, कोड में इस्तेमाल किया जाने वाला प्राइमरीबटन मेरा कस्टम बटन है। आप के साथ भी ऐसा कर सकते हैं OnPressedमें button


यह वास्तव में बहुत चालाक है! डबल क्लिक आदि को संभालने की आवश्यकता नहीं है। धन्यवाद
बेनोबा

कैसे इस परिदृश्य की तरह स्पंदन में डबल क्लिक को संभालने के लिए?

मुझे उस स्थिति में कभी भी डबल टैप को संभालने की स्थिति नहीं मिली क्योंकि सिंगल टैप पर यह लोडिंग इंडिकेटर में बदल जाता है। आपकी टिप्पणी के बारे में मेरी समझ के अनुसार मुझे लगता है कि हम कस्टम बटन को जेस्चर डिटेक्टर से लपेट सकते हैं और फिर आप वहां डबल टैप पर काम कर सकते हैं।
हर्ष पुलिकुल्लू

टर्नीरी ऑपरेटर का उपयोग कहां करें? आपका उदाहरण स्मार्ट दिखता है लेकिन यह सुनिश्चित नहीं है कि इसे कैसे लागू किया जाए।
बिक्रम पाही

निर्माण विधि में उपर्युक्त कोड स्निपेट का उपयोग करें जहाँ आप एक (लॉगिन) बटन रखना चाहते हैं। जब उपयोगकर्ता उस बटन पर क्लिक करता है तो बूल (isLading) सही हो जाता है और बटन के बजाय परिपत्र लोडिंग संकेतक दिखाता है।
हर्ष पुलिकुल्लू

20

1. बिना प्लगइन

    class IndiSampleState extends State<ProgHudPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text('Demo'),
        ),
        body: Center(
          child: RaisedButton(
            color: Colors.blueAccent,
            child: Text('Login'),
            onPressed: () async {
              showDialog(
                  context: context,
                  builder: (BuildContext context) {
                    return Center(child: CircularProgressIndicator(),);
                  });
              await loginAction();
              Navigator.pop(context);
            },
          ),
        ));
  }

  Future<bool> loginAction() async {
    //replace the below line of code with your login request
    await new Future.delayed(const Duration(seconds: 2));
    return true;
  }
}

2. प्लगइन के साथ

इस प्लगइन प्रगति की जाँच करें_हुड

pubspec.yaml फ़ाइल में निर्भरता जोड़ें

dev_dependencies:
  progress_hud: 

पैकेज आयात करें

import 'package:progress_hud/progress_hud.dart';

संकेतक को दिखाने और छिपाने के लिए नमूना कोड नीचे दिया गया है

class ProgHudPage extends StatefulWidget {
  @override
  _ProgHudPageState createState() => _ProgHudPageState();
}

class _ProgHudPageState extends State<ProgHudPage> {
  ProgressHUD _progressHUD;
  @override
  void initState() {
    _progressHUD = new ProgressHUD(
      backgroundColor: Colors.black12,
      color: Colors.white,
      containerColor: Colors.blue,
      borderRadius: 5.0,
      loading: false,
      text: 'Loading...',
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text('ProgressHUD Demo'),
        ),
        body: new Stack(
          children: <Widget>[
            _progressHUD,
            new Positioned(
                child: RaisedButton(
                  color: Colors.blueAccent,
                  child: Text('Login'),
                  onPressed: () async{
                    _progressHUD.state.show();
                    await loginAction();
                    _progressHUD.state.dismiss();
                  },
                ),
                bottom: 30.0,
                right: 10.0)
          ],
        ));
  }

  Future<bool> loginAction()async{
    //replace the below line of code with your login request
    await new Future.delayed(const Duration(seconds: 2));
    return true;
  }
}

12
इसे नीचे मत डालें, कुछ लोग यूआई के
नॉटी

3
एपी में प्रगति पट्टी काफी हद तक उचित है और निर्भरता बढ़ने से आकार में वृद्धि होती है। पहले से ही स्पंदन बिल्ड अत्यधिक है।
प्रशाँत ०२०५

क्या आपको वास्तव में देव निर्भरता के रूप में इसे जोड़ना चाहिए?
जॉर्ज


1
@MohammadMeshkani Navigator.pop (संदर्भ) का उपयोग करें; अगली स्क्रीन पर नेविगेट करने से पहले
Shyju M

13

चरण 1: बनाएँ संवाद

   showAlertDialog(BuildContext context){
      AlertDialog alert=AlertDialog(
        content: new Row(
            children: [
               CircularProgressIndicator(),
               Container(margin: EdgeInsets.only(left: 5),child:Text("Loading" )),
            ],),
      );
      showDialog(barrierDismissible: false,
        context:context,
        builder:(BuildContext context){
          return alert;
        },
      );
    }

चरण 2: इसे कॉल करें

showAlertDialog(context);
await firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
Navigator.pop(context);

उदाहरण डायलॉग और लॉगिन फॉर्म के साथ

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
class DynamicLayout extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new MyWidget();
    }
  }
showAlertDialog(BuildContext context){
  AlertDialog alert=AlertDialog(
    content: new Row(
        children: [
           CircularProgressIndicator(),
           Container(margin: EdgeInsets.only(left: 5),child:Text("Loading" )),
        ],),
  );
  showDialog(barrierDismissible: false,
    context:context,
    builder:(BuildContext context){
      return alert;
    },
  );
}

  class MyWidget extends State<DynamicLayout>{
  Color color = Colors.indigoAccent;
  String title='app';
  GlobalKey<FormState> globalKey=GlobalKey<FormState>();
  String email,password;
  login() async{
   var currentState= globalKey.currentState;
   if(currentState.validate()){
        currentState.save();
        FirebaseAuth firebaseAuth=FirebaseAuth.instance;
        try {
          showAlertDialog(context);
          AuthResult authResult=await firebaseAuth.signInWithEmailAndPassword(
              email: email, password: password);
          FirebaseUser user=authResult.user;
          Navigator.pop(context);
        }catch(e){
          print(e);
        }
   }else{

   }
  }
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar:AppBar(
        title: Text("$title"),
        ) ,
          body: Container(child: Form(
            key: globalKey,
            child: Container(
              padding: EdgeInsets.all(10),
              child: Column(children: <Widget>[
              TextFormField(decoration: InputDecoration(icon: Icon(Icons.email),labelText: 'Email'),
              // ignore: missing_return
              validator:(val){
                if(val.isEmpty)
                  return 'Please Enter Your Email';
              },
              onSaved:(val){
                email=val;
              },
              ),
                TextFormField(decoration: InputDecoration(icon: Icon(Icons.lock),labelText: 'Password'),
             obscureText: true,
                  // ignore: missing_return
                  validator:(val){
                    if(val.isEmpty)
                      return 'Please Enter Your Password';
                  },
                  onSaved:(val){
                    password=val;
                  },
              ),
                RaisedButton(color: Colors.lightBlue,textColor: Colors.white,child: Text('Login'),
                  onPressed:login),
            ],)
              ,),)
         ),
    );
  }
}

यहां छवि विवरण दर्ज करें


2
कृपया अपने उत्तर में थोड़ा और संदर्भ जोड़ें।
मृत्यु वाल्ट्ज

10

मैंने निम्नलिखित दृष्टिकोण लिया, जो एक साधारण मोडल प्रगति सूचक विजेट का उपयोग करता है जो कि आप एक async कॉल के दौरान जो भी मोडल बनाना चाहते हैं, उसे लपेटता है।

पैकेज में उदाहरण यह भी बताता है कि फॉर्म को मान्य करने के लिए एसिंक्स कॉल करते समय फॉर्म सत्यापन को कैसे संभालना है ( इस समस्या के विवरण के लिए स्पंदन / मुद्दे / 9688 देखें)। उदाहरण के लिए, फॉर्म को छोड़े बिना, इस एसिंक्स फॉर्म सत्यापन विधि का उपयोग किसी नए उपयोगकर्ता नाम को डेटाबेस में मौजूदा नामों के खिलाफ मान्य करने के लिए किया जा सकता है।

https://pub.dartlang.org/packages/modal_progress_hud

यहां पैकेज के साथ दिए गए उदाहरण का डेमो दिया गया है (स्रोत कोड के साथ):

मोडल प्रगति संकेतक के साथ async प्रपत्र सत्यापन

उदाहरण को अन्य मोडल प्रगति संकेतक व्यवहार (जैसे विभिन्न एनिमेशन, मोडल में अतिरिक्त पाठ, आदि) के लिए अनुकूलित किया जा सकता है।


2

यह ढेर के साथ मेरा समाधान है

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

final themeColor = new Color(0xfff5a623);
final primaryColor = new Color(0xff203152);
final greyColor = new Color(0xffaeaeae);
final greyColor2 = new Color(0xffE8E8E8);

class LoadindScreen extends StatefulWidget {
  LoadindScreen({Key key, this.title}) : super(key: key);
  final String title;
  @override
  LoginScreenState createState() => new LoginScreenState();
}

class LoginScreenState extends State<LoadindScreen> {
  SharedPreferences prefs;

  bool isLoading = false;

  Future<Null> handleSignIn() async {
    setState(() {
      isLoading = true;
    });
    prefs = await SharedPreferences.getInstance();
    var isLoadingFuture = Future.delayed(const Duration(seconds: 3), () {
      return false;
    });
    isLoadingFuture.then((response) {
      setState(() {
        isLoading = response;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(
            widget.title,
            style: TextStyle(color: primaryColor, fontWeight: FontWeight.bold),
          ),
          centerTitle: true,
        ),
        body: Stack(
          children: <Widget>[
            Center(
              child: FlatButton(
                  onPressed: handleSignIn,
                  child: Text(
                    'SIGN IN WITH GOOGLE',
                    style: TextStyle(fontSize: 16.0),
                  ),
                  color: Color(0xffdd4b39),
                  highlightColor: Color(0xffff7f7f),
                  splashColor: Colors.transparent,
                  textColor: Colors.white,
                  padding: EdgeInsets.fromLTRB(30.0, 15.0, 30.0, 15.0)),
            ),

            // Loading
            Positioned(
              child: isLoading
                  ? Container(
                      child: Center(
                        child: CircularProgressIndicator(
                          valueColor: AlwaysStoppedAnimation<Color>(themeColor),
                        ),
                      ),
                      color: Colors.white.withOpacity(0.8),
                    )
                  : Container(),
            ),
          ],
        ));
  }
}

2

मैं इस प्लगइन flutter_easyloading का उपयोग करने का सुझाव देता हूं

flutter_easyloading स्वच्छ और हल्का है स्पंदन ऐप के लिए लोड हो रहा है विजेट, संदर्भ के बिना उपयोग करने में आसान, आईओएस और एंड्रॉइड का समर्थन करता है

इसे अपने पैकेज की pubspec.yamlफ़ाइल में जोड़ें :

dependencies:
  flutter_easyloading: ^2.0.0

अब आपके डार्ट कोड में, आप उपयोग कर सकते हैं:

import 'package:flutter_easyloading/flutter_easyloading.dart';

सबसे पहले उपयोग करने के लिए, प्रारंभ FlutterEasyLoadingमें MaterialApp/CupertinoApp

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import './custom_animation.dart';

import './test.dart';

void main() {
  runApp(MyApp());
  configLoading();
}

void configLoading() {
  EasyLoading.instance
    ..displayDuration = const Duration(milliseconds: 2000)
    ..indicatorType = EasyLoadingIndicatorType.fadingCircle
    ..loadingStyle = EasyLoadingStyle.dark
    ..indicatorSize = 45.0
    ..radius = 10.0
    ..progressColor = Colors.yellow
    ..backgroundColor = Colors.green
    ..indicatorColor = Colors.yellow
    ..textColor = Colors.yellow
    ..maskColor = Colors.blue.withOpacity(0.5)
    ..userInteractions = true
    ..customAnimation = CustomAnimation();
}

फिर, अपनी आवश्यकता के अनुसार उपयोग करें

import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:dio/dio.dart';

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  @override
  void initState() {
    super.initState();
    // EasyLoading.show();
  }

  @override
  void deactivate() {
    EasyLoading.dismiss();
    super.deactivate();
  }

  void loadData() async {
    try {
      EasyLoading.show();
      Response response = await Dio().get('https://github.com');
      print(response);
      EasyLoading.dismiss();
    } catch (e) {
      EasyLoading.showError(e.toString());
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter EasyLoading'),
      ),
      body: Center(
        child: FlatButton(
          textColor: Colors.blue,
          child: Text('loadData'),
          onPressed: () {
            loadData();
            // await Future.delayed(Duration(seconds: 2));
            // EasyLoading.show(status: 'loading...');
            // await Future.delayed(Duration(seconds: 5));
            // EasyLoading.dismiss();
          },
        ),
      ),
    );
  }
}

यहां छवि विवरण दर्ज करें


कस्टम एनीमेशन क्लास कहाँ है? क्या हमें इसे शामिल करने की आवश्यकता है।
नायस सुब्रमण्यन

नहीं, आपको इसकी आवश्यकता नहीं है, और यदि आप चाहते हैं, तो इसके लिए जाएं: github.com/huangjianke/flutter_easyloading/blob/develop/example/…
परेश मंगुआक्या

1

आप इसके बजाय FutureBuilder विजेट का उपयोग कर सकते हैं। यह एक तर्क है जो एक भविष्य होना चाहिए। फिर आप एक स्नैपशॉट का उपयोग कर सकते हैं जो कि लॉग इन करते समय async कॉल के समय की स्थिति है, एक बार जब यह समाप्त हो जाता है तो async फ़ंक्शन रिटर्न की स्थिति अपडेट हो जाएगी और भविष्य का बिल्डर खुद को फिर से बना देगा ताकि आप फिर नए के लिए पूछ सकें राज्य।

FutureBuilder(
  future:  myFutureFunction(),
  builder: (context, AsyncSnapshot<List<item>> snapshot) {
    if (!snapshot.hasData) {
      return Center(
        child: CircularProgressIndicator(),
      );
    } else {
     //Send the user to the next page.
  },
);

यहां आपके पास एक उदाहरण है कि भविष्य का निर्माण कैसे करें

Future<void> myFutureFunction() async{
 await callToApi();}

1

आप इसे केंद्र पारदर्शी प्रगति संकेतक के लिए कर सकते हैं

Future<Null> _submitDialog(BuildContext context) async {
  return await showDialog<Null>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return SimpleDialog(
          elevation: 0.0,
          backgroundColor: Colors.transparent,
          children: <Widget>[
            Center(
              child: CircularProgressIndicator(),
            )
          ],
        );
      });
}

0
class Loader extends StatefulWidget {
      @override
      State createState() => LoaderState();
    }

    class LoaderState extends State<Loader> with SingleTickerProviderStateMixin {
      AnimationController controller;
      Animation<double> animation;

      @override
      void initState() {
        super.initState();
        controller = AnimationController(
            duration: Duration(milliseconds: 1200), vsync: this);
        animation = CurvedAnimation(parent: controller, curve: Curves.elasticOut);
        animation.addListener(() {
          this.setState(() {});
        });
        animation.addStatusListener((AnimationStatus status) {});
        controller.repeat();
      }

      @override
      void dispose() {
        controller.dispose();
        super.dispose();
      }

      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              color: Colors.blue,
              height: 3.0,
              width: animation.value * 100.0,
            ),
            Padding(
              padding: EdgeInsets.only(bottom: 5.0),
            ),
            Container(
              color: Colors.blue[300],
              height: 3.0,
              width: animation.value * 75.0,
            ),
            Padding(
              padding: EdgeInsets.only(bottom: 5.0),
            ),
            Container(
              color: Colors.blue,
              height: 3.0,
              width: animation.value * 50.0,
            )
          ],
        );
      }
    }


    Expanded(
                        child: Padding(
                          padding:
                              EdgeInsets.only(left: 20.0, right: 5.0, top:20.0),
                          child: GestureDetector(
                            onTap: () {
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => FirstScreen()));
                            },
                            child: Container(
                                alignment: Alignment.center,
                                height: 45.0,
                                decoration: BoxDecoration(
                                    color: Color(0xFF1976D2),
                                    borderRadius: BorderRadius.circular(9.0)),
                                child: Text('Login',
                                    style: TextStyle(
                                        fontSize: 20.0, color: Colors.white))),
                          ),
                        ),
                      ),

मैं एक वर्ग को कैसे जोड़ सकता हूं जो मेरे बटन के साथ एक लोडिंग संकेतक बनाता है, ताकि जब मैं इसे दबाऊं, तो संकेतक चालू हो जाए और अगले पृष्ठ पर फ़्लिप हो जाए?
मैक्स जुबको

0
{
isloading? progressIos:Container()

progressIos(int i) {
    return Container(
        color: i == 1
            ? AppColors.liteBlack
            : i == 2 ? AppColors.darkBlack : i == 3 ? AppColors.pinkBtn : '',
        child: Center(child: CupertinoActivityIndicator()));
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.