কীভাবে বাড়াতে অগ্রগতি সূচক নিয়ে কাজ করবেন?


93

আমি তোড়জোড়ায় নবাগত CircularProgressIndicatorএবং আমার লেআউটে আরও ভাল উপায় যুক্ত করার উপায়টি জানতে চাই । উদাহরণস্বরূপ, আমার লগইন ভিউ। এই ভিউটিতে ব্যবহারকারীর নাম, পাসওয়ার্ড এবং লগইন বোতাম রয়েছে। আমি একটি ওভারলে লেআউট তৈরি করতে চাই (সাথে Opacity) যা লোড করার সময়, আমি যেমন নেটিস্ক্রিপ্টে ব্যবহার করি তেমনি অগ্রগতি সূচক দেখায় তবে কীভাবে কীভাবে করা যায় এবং এটি যদি আরও ভাল হয় তবে আমি খুব বিভ্রান্ত হয়েছি। নেটিভস্ক্রিপ্টে, উদাহরণস্বরূপ, আমি মূল বিন্যাসে সূচকঅ্যাক্টিভিটি যুক্ত করি এবং সত্য বা মিথ্যাতে ব্যস্ত থাকি, সুতরাং লোড হওয়ার সময় এটি সমস্ত দর্শন উপাদানকে ওভারলে করে।

সম্পাদনা করুন:

আমি এই ফলাফলটিতে পৌঁছাতে সক্ষম হয়েছি:

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

অ্যাপ্লিকেশন স্ক্রিন ফলাফল

আমি এখনও রাজ্যগুলির ধারণার সাথে খাপ খাইয়ে নিচ্ছি। এই কোডটি প্রত্যাশার মধ্যে থাকা যখন ঝাঁকুনির সাথে কাজ করার সময়?

ধন্যবাদ!


4
ডায়ালগ প্রদর্শিত হচ্ছে কিভাবে ব্যাকপ্রেস অক্ষম করবেন?
দ্রুত শিক্ষার্থী

উত্তর:


83

বিড়বিড় করে, অ্যাসিক্রোনাস ক্রিয়াগুলি মোকাবেলা করার কয়েকটি উপায় রয়েছে।

এটি করার একটি অলস উপায় কোনও মডেল ব্যবহার করা যেতে পারে। যা ব্যবহারকারীদের ইনপুটটিকে অবরুদ্ধ করে দেবে, এইভাবে কোনও অযাচিত পদক্ষেপ রোধ করবে। এর জন্য আপনার কোডে খুব সামান্য পরিবর্তন দরকার। আপনার _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),
          );
        }
      },
    );
  }
}

4
দুর্দান্ত, দুটি উদাহরণই লগইন এবং অন্যান্য পরিস্থিতিতে কার্যকর হবে। ডায়লগ সহ হ্যান্ডলার অগ্রগতি আমার সংস্করণ এবং ফিউচারবিল্ডারের চেয়ে ভাল দেখায় এটি আমার সমাধানের চেয়েও মার্জিত। সাহায্যের জন্য ধন্যবাদ!
রিকার্ডো বোচি

প্রশ্ন ছাড়াই বিষয় .. প্রতিটি টেক্সটফিল্ডে আমার কি টেক্সটএডিটিংকন্ট্রোলার অনন্য প্রয়োজন?
রিকার্ডো বোচি

@RicardoBocchi হ্যাঁ
aziza

ডায়ালগটি প্রকৃত উদাহরণ দিয়ে কাজ করবে বলে আমি মনে করি না, এটি লগইন () ফিরিয়ে দেওয়ার পরে ব্যবহারকারী কীভাবে পুনঃনির্দেশিত হবে তা বিভ্রান্তিকর। আপনার দ্বিতীয় উদাহরণটি যদিও আরও সুবিধাজনক বলে মনে হচ্ছে। ভাল বেকড।
আজিজা

4
ঠিক আছে, ডায়ালগটি কার্যকরী এবং তার মূল কোডটিতে খুব সামান্য পরিবর্তন দরকার। তিনি উদাহরণস্বরূপ একটি এর সাথে ডায়লগটি অনুসরণ করতে পারেন Navigator.pushNamed("/home")
রামি রুসলেট

39

আমার পক্ষে এটি করার একটি ঝরঝরে উপায় হ'ল 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,),

      ],));
  }

}

হাই, আমি এটি করতে চেয়েছিলাম, কিন্তু আমি আমার প্রয়োজনীয় বিন্যাসটি পাচ্ছিলাম না। স্ট্যাকের উত্তর। স্টেটফুল উইজেট সম্পর্কে, যখন অগ্রগতি রাষ্ট্রের পরিবর্তন হয় তখন কি এটি সমস্ত দৃষ্টিভঙ্গি সঠিক?
রিকার্ডো বোচি

আরে, আমি আপনার প্রশ্ন বুঝতে পারছি না?
আজিজা

আমার কোডে, যখন _loadingপরিবর্তন হয়, সমস্ত দর্শন পুনর্নির্মাণ করা হয়। তাই নাকি?
রিকার্ডো বোচি

4
একই সাথে একটি মডেল ব্যবহার করা সম্ভবত অনেক সহজ এবং আরও স্বজ্ঞাত। আপনি ভিক্ষা বা আপনার অনুরোধে একটি লোডিং কথোপকথনটি চাপ দিতে পারেন এবং শেষ হয়ে গেলে এটি পপ করতে পারেন। এটিতে আরও ব্যবহারকারীর ইনপুট আটকাতে সুবিধা রয়েছে।
রুমি রাউসলেট

4
ওকে, আমাকে কিছু বেক করতে দাও।
রুমি রাউসলেট

39

একটি বিল তৈরি করুন 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


এটি আসলে বেশ স্মার্ট! ডাবল ক্লিক ইত্যাদি পরিচালনা করার দরকার নেই ধন্যবাদ।
বেনোবব

কীভাবে এই দৃশ্যের মতো ডাবল ক্লিকগুলিতে হ্যান্ডেল করবেন?

ডাবল টেপ হ্যান্ডেল করার মতো পরিস্থিতি আমি কখনই পাইনি যেমন একক ট্যাপের সাথে এটি লোডিং সূচকে পরিবর্তিত হয়। আপনার মতামত সম্পর্কে আমার বোঝাপড়া অনুসারে আমি মনে করি আমরা অঙ্গভঙ্গি সনাক্তকারীর সাহায্যে কাস্টম বোতামটি মোড়াতে পারি এবং তারপরে আপনি সেখানে ডাবল ট্যাপের কাজ করতে পারেন।
হর্ষ পুলিকোল্লু

টেরিনারি অপারেটরটি কোথায় ব্যবহার করবেন? আপনার উদাহরণটি স্মার্ট দেখায় তবে কীভাবে এটি প্রয়োগ করা যায় তা নিশ্চিত নয়।
বিক্রম পাহি

আপনি যেখানে (লগইন) বোতামটি রাখতে চান সেখানে বিল্ড পদ্ধতিতে উল্লিখিত কোড স্নিপেট ব্যবহার করুন। যখন ব্যবহারকারী সেই বোতামটি ক্লিক করে বুলে (ইসলোডিং) সত্য হয়ে যায় এবং বোতামটির পরিবর্তে বৃত্তাকার লোডিং সূচকটি দেখায়।
হর্ষ পুলিকোল্লু

24

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. প্লাগইন সহ

এই প্লাগ পরীক্ষা progress_hud

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
এটিকে ভোট দেবেন না, কিছু লোক ইউআই এর কৌতুকপূর্ণ-বিশদ বিবরণ পরিচালনা করতে চায় না এবং তাদের মধ্যে একটি
হ'ল

4
এপিআই-তে অগ্রগতি বারটি যথেষ্ট পরিমাণে নির্ভরশীলতা বাড়ানোর আকার বাড়ায়। ইতোমধ্যে তোলপাড় করা অত্যধিক।
prashant0205

আপনার কি সত্যই ডেভ নির্ভরতা হিসাবে যুক্ত করা উচিত?
জর্জ

সর্বশেষ উদাহরণের সাথে চেক করুন pub.dartlang.org/packages/progress_hud#-example-tab-
Shyju এম

4
@ মোহাম্মদমেশকানি নেভিগেটর.পপ (প্রসঙ্গ) ব্যবহার করুন; পরবর্তী স্ক্রিনে নেভিগেট করার আগে
শাইজু এম

17

পদক্ষেপ 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),
            ],)
              ,),)
         ),
    );
  }
}

এখানে চিত্র বর্ণনা লিখুন


4
দয়া করে আপনার উত্তরে আরও কিছু প্রসঙ্গ যুক্ত করুন।
ডেথ ওয়াল্টজ

10

আমি নীচের পদ্ধতিটি গ্রহণ করেছি, যা একটি সাধারণ মডেল অগ্রগতি সূচক উইজেট ব্যবহার করে যা একটি অ্যাসিঙ্ক কল চলাকালীন আপনি মডেলটি যা করতে চান তা মোড়ক করে।

প্যাকেজের উদাহরণটিও ফর্মটিকে বৈধতা দেওয়ার জন্য অ্যাসিঙ্ক কল করার সময় ফর্ম বৈধতা হ্যান্ডেল করার পদ্ধতিটিকেও সম্বোধন করে ( এই সমস্যার বিশদগুলির জন্য বিড়ম্বনা / ইস্যু / 9688 দেখুন )। উদাহরণস্বরূপ, ফর্মটি ছাড়াই, এই অ্যাসিঙ্ক ফর্ম বৈধকরণ পদ্ধতিটি সাইন আপ করার সময় একটি ডাটাবেসে বিদ্যমান নামের বিপরীতে একটি নতুন ব্যবহারকারীর নাম বৈধ করতে ব্যবহার করা যেতে পারে।

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

প্যাকেজটি সরবরাহ করা উদাহরণটির ডেমো এখানে রয়েছে (উত্স কোড সহ):

মডেল অগ্রগতি সূচক সহ অ্যাসিঙ্ক ফর্মের বৈধতা

উদাহরণটি অন্যান্য মডেল অগ্রগতি সূচক আচরণের সাথে অভিযোজিত হতে পারে (যেমন বিভিন্ন অ্যানিমেশন, মডেলের অতিরিক্ত পাঠ্য ইত্যাদি))।


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

আপনি এটি কেন্দ্রের স্বচ্ছ অগ্রগতির সূচকের জন্য করতে পারেন

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

2

আমি এই প্লাগইনটি ব্যবহার করার পরামর্শ দিই 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(
  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
{
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()));
  }
}

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

আমি কীভাবে এমন একটি ক্লাসকে যুক্ত করতে পারি যা আমার বোতামের সাথে লোডিং সূচক তৈরি করে, যাতে আমি এটি টিপলে সূচকটি চালু হয় এবং পরবর্তী পৃষ্ঠায় চলে যায়?
ম্যাক্স জুবকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.