簡體   English   中英

如何在 Flutter 中實現 CircularProgressIndicator

[英]How to implement CircularProgressIndicator in Flutter

我正在嘗試在等待用戶完成身份驗證過程時實現 CircularProgressIndicator,這是代碼,我使用 Firebase 作為身份驗證后端

 Future<void> signIn() async {
    if (_formKey.currentState.validate()) {
      new Loading();
      _formKey.currentState.save();
      try {
        final user = await FirebaseAuth.instance
            .signInWithEmailAndPassword(email: _email, password: _password);
        if (user != null) {
          final FirebaseUser user = await auth.currentUser();
          print('success login');
          Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                builder: (context) => Home(user: user),
              ));
        }
      } catch (e) {
        print(e);
      }
    }
  }

如何在代碼中實現circularprogressindicator?

CircularProgressIndicator 可以在帶有條件的 UI 中實現。如果您想在頁面的某些區域中實現它,您可以使用布爾值使其像這樣工作:

 bool showCircular = false;

  Future<void> signIn() async {
    if (_formKey.currentState.validate()) {
      new Loading();
      _formKey.currentState.save();
      setState(() {
        showCircular=true;
       });
      try {
        final user = await FirebaseAuth.instance
            .signInWithEmailAndPassword(email: _email, password: _password);
        if (user != null) {
          final FirebaseUser user = await auth.currentUser();
         setState(() {
           showCircular=false;
         });
          print('success login');
          Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                builder: (context) => Home(user: user),
              ));
        }
      } catch (e) {
        print(e);
      }
    }
  }

現在在你的 UI 中的任何地方添加這個小部件:

showCircular ? CircularProgressIndicator() : SizedBox(),

推薦的方法是使用AlertDialog來顯示進度指示器。 這是一個 AlertDialog 的例子。要打開 Dialogs,你需要上下文,所以將 BuildContext 作為參數並調用 signIn(context); 從登錄按鈕開始。我們將使用openLoadingDialog函數調用對話框,當登錄完成時,我們將使用Navigator.of(context).pop();彈出它

Future<void> signIn(BuildContext context) async {
    if (_formKey.currentState.validate()) {
      new Loading();
      _formKey.currentState.save();
            openLoadingDialog(context, 'Signing In...');

      try {
        final user = await FirebaseAuth.instance
            .signInWithEmailAndPassword(email: _email, password: _password);
        if (user != null) {
          final FirebaseUser user = await auth.currentUser();
         Navigator.of(context).pop();
          print('success login');
          Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                builder: (context) => Home(user: user),
              ));
        }
      } catch (e) {
        print(e);
      }
    }
  }

將此對話框粘貼到您的應用程序中的任何位置。您可以通過傳遞要顯示的上下文和消息來調用它。

 openLoadingDialog(BuildContext context, String text) {
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) => AlertDialog(
        content: Row(children: <Widget>[
          SizedBox(
            width: 30,
            height: 30,
            child: CircularProgressIndicator(
              strokeWidth: 1,
              valueColor: AlwaysStoppedAnimation(Colors.black)
            )
          ),

          SizedBox(width: 10),

          Text(text)
        ]),
      )
    );
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM