0

我希望在用户登录设备时显示循环进度指示器。我在网上看到了各种方法,其中一种是使用 bool _isloading 像这里但在这里它用 curcularprogressindicator 替换了我的按钮并且没有登录 + 我希望指示器在中心screen 和其他是在使用我不需要的 futurebuilder 时。所以,我想了很多,找不到任何东西,所以如果你能帮助我,那就太好了。

我的代码:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:green_earth/mainpage.dart';
import 'package:http/http.dart' as http;

Future<void> attemptSignUp(String username, String password,BuildContext context) async {
  final http.Response res = await http.post(
          'https://green-earth.herokuapp.com/signup',
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
        body:jsonEncode(<String, String>{
        "email":username,
        "password":password
      }),
  );
  CircularProgressIndicator();
  if (res.statusCode==200){
    Navigator.of(context).pushNamed('/home');
  }
  else{
    _showMyDialog(context,res.statusCode);
  }
}
// print("res status code=${res.statusCode}  $username $password ${jsonDecode(res.body)}")
Future<void> _showMyDialog(BuildContext context,int statuscode) async {
  return showDialog<void>(
    context: context,
    barrierDismissible: false, // user must tap button!
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text('Error'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              statuscode==422?Text('Email ID is already taken. Please try again!'):Text('Authorisation was failed with status code $statuscode'),
            ],
          ),
        ),
        actions: <Widget>[
          TextButton(
            child: Text('OK'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );
}

调用函数

GestureDetector(
                    onTap:(){
                      if(formkey2.currentState.validate()==true){
                        signupUsername=signupUsernameController.text;
                        signupPassword=signupPasswordController.text;
                        attemptSignUp(signupUsername, signupPassword,context);

                      }
                    },
                    child: PrimaryButton(
                      btnText: "Create Account",
                    ),
                  ),
4

1 回答 1

0

根据另一个问题中提供的人的答案,如果您不想替换按钮,则可以使用相同的逻辑,但改用堆栈

Stack(
  children: [
    (... your login form ...),
    _isLoading ? CircularProgressIndicator() : SizedBox.srink(),
  ],
);

您可以将其修改为您想要的任何样式(如果您还想模糊背景等),但这是基本方法。

更新

改变你的水龙头是这样的:

onTap:() async {
  if(formkey2.currentState.validate()==true){
    signupUsername=signupUsernameController.text;
    signupPassword=signupPasswordController.text;
    setState((){
      _isLoading = true;
    });
    await attemptSignUp(signupUsername, signupPassword,context);
    setState((){
      _isLoading = false;
    }); 
}

注意到我已经onTap异步等待未来,并且我正在使用setState来简化示例,但这意味着更新 UI。

于 2021-01-08T14:37:22.777 回答