Flutter'da ilerleme göstergesi ile nasıl çalışılır?


93

Flutter konusunda acemiyim ve düzenime eklemenin daha iyi bir yolunu öğrenmek istedim CircularProgressIndicator. Örneğin, giriş görünümüm. Bu görünümde kullanıcı adı, şifre ve oturum açma Düğmesi bulunur. OpacityYüklerken, NativeScript'te kullandığım gibi ilerleme göstergesini gösteren bir bindirme düzeni (ile ) oluşturmak istedim, ancak nasıl yapılacağı konusunda biraz kafam karıştı ve eğer daha iyi bir yol ise. Örneğin, NativeScript'te, ana mizanpaja IndicatorActivity ekliyorum ve meşgul'ü doğru veya yanlış olarak ayarlıyorum, böylece yüklenirken tüm görünüm bileşenlerini kaplayacak.

Düzenle:

Bu sonuca ulaşabildim:

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

uygulama ekranı sonucu

Hâlâ devletler fikrine adapte oluyorum. Flutter ile çalışırken bu kod beklenen dahilinde mi?

Teşekkürler!


1
iletişim kutusu gösterilirken geri basılmış nasıl devre dışı bırakılır?
Hızlı öğrenen

Yanıtlar:


82

Flutter'da, Eşzamansız eylemlerle başa çıkmanın birkaç yolu vardır.

Bunu yapmanın tembel bir yolu, bir model kullanmak olabilir. Bu, kullanıcı girişini engelleyecek, böylece istenmeyen eylemleri önleyecektir. Bu, kodunuzda çok az değişiklik gerektirir. Sadece senin _onLoadinggibi bir şeye değiştiriyorum :

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

Bunu yapmanın en ideal yolu, FutureBuilderdurum bilgisi olan bir pencere öğesi kullanmaktır. Başladığın şey bu. İşin püf noktası, bulunduğunuz boolean loading = falseeyalette a bulundurmak yerine , doğrudan birFuture<MyUser> user

Ve sonra bunu argüman FutureBuilderolarak iletin, bu size "hasData" veya örneği gibi bazı bilgiler verecektir.MyUser tamamlandığı .

Bu, şuna benzer bir şeye yol açar:

@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
Harika, her iki örnek de oturum açma ve diğer durumlarda faydalı olacaktır. İletişim kutusu ile işleyici ilerlemesi benim sürümümden ve FutureBuilder'dan daha iyi görünüyor. Benim çözümümden de daha zarif. yardım için teşekkürler!
Ricardo Bocchi

konu dışı bir soru .. her TextField için benzersiz bir TextEditingController'a ihtiyacım var mı?
Ricardo Bocchi

@RicardoBocchi Evet
aziza

Diyalogun gerçek örnekle çalışacağını düşünmüyorum, kullanıcının _login () döndürüldükten sonra nasıl yeniden yönlendirileceği kafa karıştırıcı. İkinci örneğiniz çok daha uygun görünüyor. İyi pişmiş.
aziza

1
Diyalog işlevseldir ve orijinal kodunda çok az değişiklik gerektirir. Örneğin, a ile diyaloğu yakından takip edebilir Navigator.pushNamed("/home").
Rémi Rousselet

39

Benim için bunu yapmanın güzel bir yolu SnackBar, Oturum Açma işlemi yapılırken altta bir göstermektir , bu ne demek istediğimin bir örneğidir:

görüntü açıklamasını buraya girin

.Dll dosyasının nasıl kurulacağı aşağıda açıklanmıştır SnackBar.

İçin genel bir anahtar tanımlayın Scaffold

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

Scaffold keyÖzelliğinize ekleyin

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

Oturum Açma düğmem onPressedgeri araması :

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

Bu gerçekten düzeninizi nasıl inşa etmek istediğinize bağlı ve aklınızda ne olduğundan emin değilim.

Düzenle

Muhtemelen bu şekilde istiyorsunuz, bu sonucu elde etmek için bir Yığın kullandım ve sadece göstergemi şuna göre gösterin veya gizleyin: onPressed

görüntü açıklamasını buraya girin

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

      ],));
  }

}

Merhaba, yapmak istediğim buydu ama ihtiyacım olan düzeni alamıyordum. Yığın cevaptır. StatefulWidget hakkında, ilerleme durumu değiştiğinde tüm görünümü doğru şekilde oluşturuyor mu?
Ricardo Bocchi

Hey, sorunuzu anlamadım?
aziza

Kodumda, _loadingdeğişiklik yapıldığında tüm görünümler yeniden oluşturulur. Öyle mi?
Ricardo Bocchi

1
Bir modal kullanmak muhtemelen çok daha kolay ve aynı zamanda daha sezgiseldir. Başlangıçta veya isteğinizde bir yükleme iletişim kutusuna basabilir ve bittiğinde onu açabilirsiniz. Ayrıca, daha fazla kullanıcı girişini önleme avantajına da sahiptir.
Rémi Rousselet

2
Tamam, bir şeyler pişirmeme izin ver.
Rémi Rousselet

38

Bir bool oluşturun isLoadingve ayarlayın false. Üçlü operatör yardımıyla, zaman içinde giriş düğmesi seti durumuna tıkladığında isLoadingiçin true. Giriş düğmesi yerine dairesel yükleme göstergesi alacaksınız

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

Giriş tıklanmadan önce ekran görüntülerinin nasıl göründüğünü görebilirsiniz. görüntü açıklamasını buraya girin

Giriş tıklandıktan sonra görüntü açıklamasını buraya girin

Bu arada, oturum açma işlemini çalıştırabilir ve kullanıcı oturum açabilirsiniz. Kullanıcı kimlik bilgileri daha sonra tekrar yanlışsa, olur setStateait isLoadingetmek false, öyle ki yükleme göstergesi kullanıcıya görünmez ve giriş düğmesi görünür hale gelecektir. Bu arada, kodda kullanılan primaryButton benim özel düğmem. Aynı işlemleri yapabilirsiniz OnPressediçinde button.


Bu aslında oldukça akıllıca! Çift tıklama vb. İşlemlere gerek yok. Teşekkürler.
Benobab

bu senaryo gibi çarpıntıda çift tıklama nasıl işlenir?

Tek dokunuşta yükleme göstergesine dönüştüğü için çift dokunmayı hiçbir zaman halledemedim. Yorumunuzla ilgili anlayışıma göre, özel düğmeyi hareket detektörü ile sarabileceğimizi ve ardından orada çift dokunarak çalışabileceğinizi düşünüyorum.
Harsha pulikollu

Üçlü operatör nerede kullanılır? Örneğiniz akıllı görünüyor ama nasıl uygulanacağından emin değil.
Bikram Pahi

Bir (oturum açma) düğmesine sahip olmak istediğiniz derleme yönteminde yukarıda belirtilen kod parçacığını kullanın. Kullanıcı bu düğmeye tıkladığında bool (isLoading) gerçek olur ve düğme yerine dairesel yükleme göstergesini gösterir.
Harsha pulikollu

23

1. Eklenti olmadan

    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. Eklenti ile

bu eklentiyi kontrol et progress_hud

bağımlılığı pubspec.yaml dosyasına ekleyin

dev_dependencies:
  progress_hud: 

paketi içe aktar

import 'package:progress_hud/progress_hud.dart';

Göstergeyi göstermek ve gizlemek için örnek kod aşağıda verilmiştir.

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
Buna oy vermeyin, bazı insanlar UI'nin
nitty

3
API'deki ilerleme çubuğu yeterince adildir, bağımlılık eklemek derleme boyutunu artırır. zaten flutter yapısı aşırıdır.
prashant0205

Bunu gerçekten bir Dev Dependency olarak eklemeli misiniz?
George


1
@MohammadMeshkani Navigator.pop (içerik) kullanın; sonraki ekrana geçmeden önce
Shyju M

15

1. Adım: İletişim Kutusu Oluşturun

   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. Adım: Ara

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

Diyalog ve oturum açma formu ile örnek

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

görüntü açıklamasını buraya girin


2
Lütfen cevabınıza biraz daha fazla bağlam ekleyin.
Death Waltz

10

Async çağrı sırasında modal yapmak istediğiniz her şeyi saran basit bir modal ilerleme göstergesi widget'ı kullanan aşağıdaki yaklaşımı benimsedim.

Paketteki örnek, aynı zamanda formu doğrulamak için zaman uyumsuz çağrılar yaparken form doğrulamasının nasıl işleneceğini de ele almaktadır (bu sorunun ayrıntıları için flutter / issues / 9688'e bakın). Örneğin, formdan ayrılmadan, bu eşzamansız form doğrulama yöntemi, kaydolurken bir veritabanındaki mevcut adlara göre yeni bir kullanıcı adını doğrulamak için kullanılabilir.

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

İşte paketle (kaynak koduyla) sağlanan örneğin demosu:

kalıcı ilerleme göstergesi ile eşzamansız form doğrulama

Örnek, diğer modal ilerleme göstergesi davranışına uyarlanabilir (farklı animasyonlar, modal ek metin vb. Gibi).


2

Bu benim stack ile çözümüm

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

Merkez şeffaf ilerleme göstergesi için yapabilirsiniz

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

Bu eklentiyi flutter_easyloading kullanmanızı öneririm

flutter_easyloading, Flutter Uygulaması için temiz ve hafif Yükleme widget'ıdır, bağlam olmadan kullanımı kolaydır, iOS ve Android'i destekler

Bunu paketinizin pubspec.yamldosyasına ekleyin :

dependencies:
  flutter_easyloading: ^2.0.0

Artık Dart kodunuzda şunları kullanabilirsiniz:

import 'package:flutter_easyloading/flutter_easyloading.dart';

İlk kullanmak için, / FlutterEasyLoadingiçinde başlatMaterialAppCupertinoApp

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

Ardından, ihtiyacınıza göre kullanın

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

görüntü açıklamasını buraya girin


Özel animasyon sınıfı nerede? Dahil etmemiz gerekiyor mu?
Nayas Subramanian

Hayır, buna gerek yok ve isterseniz şu adrese gidin: github.com/huangjianke/flutter_easyloading/blob/develop/example/…
Paresh Mangukiya

1

Bunun yerine FutureBuilder widget'ını kullanabilirsiniz. Bu, bir Gelecek olması gereken bir argümanı alır. Ardından, oturum açarken eşzamansız çağrının şu anki durumu olan bir anlık görüntü kullanabilirsiniz, eşzamansız işlevin durumu sona erdiğinde dönüş güncellenecek ve gelecekteki oluşturucu kendini yeniden oluşturacak, böylece daha sonra yenisini isteyebilirsiniz. durum.

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

Burada bir Geleceği nasıl inşa edeceğinize dair bir örnek var

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

Yükleme göstergesi oluşturan bir sınıfı düğmemle nasıl birleştirebilirim, böylece bastığımda gösterge yanar ve sonraki sayfaya geçer?
Max Zubko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.