Я пытаюсь показать индикатор прогресса, когда я вхожу в систему. Я создал логическое значение для переключения, когда я хочу показать и скрыть индикатор, однако я не могу понять, где именно я должен показывать индикатор.

Я могу добавить его в качестве одного из моих виджетов в моем контейнере, где я отображаю все другие экранные виджеты, однако я не хочу, чтобы он мешал другим виджетам и скорее отображался поверх всех из них. Как мне этого добиться? Как мне этого добиться?

Заранее спасибо.

Мой код

import ....

class Login extends StatefulWidget{
...
}

class _LoginState extends State<Login> {

bool _loading = false;

  @override
  Widget build(BuildContext context){

    Future<Map<String, dynamic>> getData() async {
      var client = http.Client();

      //to SHOW Indicator
      setState(() {
        _loading = true;
      });

      var response = await client
          .post(
          Uri.encodeFull(
              ' api url '),
          body:
        {"email":"$username","password":"$password"}

      ).whenComplete(
          client.close);

      var res = json.decode(response.body);

      //to HIDE indicator
      setState(() {
        _loading = false;
      });

      if(response.statusCode <200 || response.statusCode > 400){
        print("Error");
         throwError();
      }
      if(response.statusCode == 200 ){
        widget.onSignedIn();
      }

      if (!mounted)
        return {'success': false};

      return json.decode(response.body);
    }


    Container view = Container(
      ....
    );

    return Scaffold(
        resizeToAvoidBottomPadding: false,
      body: view

    );
  }
}
-1
Denise 29 Май 2019 в 15:21

2 ответа

Лучший ответ

Как CopsOnRoad упоминалось, вы должны использовать Stack, если хотите разместить несколько Widget, которые делают не мешать друг другу.

Кроме того, в Dart 2.3 была представлена коллекция if . С его помощью вы можете добавить элемент в свой Collection, только если условие true.

Stack(
  alignment: Alignment.center,
  children: [
    Container(child: ...),
    if (_loading) CircularProgressIndicator(),
  ],
)
2
CopsOnRoad 29 Май 2019 в 12:58

Вы можете использовать xs_progress_hud: ^1.0.2 эту библиотеку и импортировать из здесь

Показать диалог

 XsProgressHud.show(context);

Скрыть диалог

 XsProgressHud.hide();

Здесь вы можете сделать что-то подобное в своем коде.

 Future<Map<String, dynamic>> getData() async {
      var client = http.Client();
      XsProgressHud.show(context);
      //to SHOW Indicator
      setState(() {
        _loading = true;
      });

      var response = await client
          .post(
          Uri.encodeFull(
              ' api url '),
          body:
        {"email":"$username","password":"$password"}

      ).whenComplete(
          client.close);

      var res = json.decode(response.body);

      //to HIDE indicator
      setState(() {
        _loading = false;
      });

      if(response.statusCode <200 || response.statusCode > 400){
        XsProgressHud.hide();
        print("Error");
         throwError();
      }
      if(response.statusCode == 200 ){
        XsProgressHud.hide();
        widget.onSignedIn();
      }

      if (!mounted)
        return {'success': false};

      return json.decode(response.body);
    }
0
Farhana 29 Май 2019 в 12:43