Невозможно изменить переменную загрузки во Flutter

У меня проблема с загружаемой переменной.

У меня есть экран приветствия, который проходит через Firebase User. Я получаю UID пользователя, а из коллекции я получаю имя поля.

Итак, у меня есть следующий код:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

import '../widgets/app_drawer.dart';
import '../widgets/footer.dart';

class InitialScreen extends StatefulWidget {
  static const routeName = '/initial';  

  @override
  _InitialScreenState createState() => _InitialScreenState();
}



class _InitialScreenState extends State<InitialScreen> {
   final _auth = FirebaseAuth.instance;
    var _nombre;
    var _isLoading = false;

 **void inputData() async {
   try {
     setState(() {
       _isLoading = true;
     });
      final FirebaseUser user = await _auth.currentUser();
      Firestore.instance
          .collection('users')
          .document(user.uid)
          .get()
          .then((value) {
        setState(() {
          _nombre = value['nombre']; 
          _isLoading = false;       
        });
      });
       setState(() {
          _isLoading = false;
        });
   } catch (err) {
        print(err);
      setState(() {
        _isLoading = false;
      });
   }
  }**
  

  @override
  Widget build(BuildContext context) {
    inputData();
    _isLoading = false;
    return  Scaffold(
      drawer: AppDrawer(),
      appBar: AppBar(
        title: Text('Macabeos'),
      ),
      body: _isLoading ? Text(_nombre) : Container(
        alignment: Alignment.topCenter,
        child: SingleChildScrollView(
                  child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: CircleAvatar(
                  backgroundImage: NetworkImage(
                      'https://firebasestorage.googleapis.com/v0/b/flutter-chat-8b2e0.appspot.com/o/others%2Ftaber.png?alt=media&token=0381a057-bf69-4885-8690-f25e6f1abfe0'),
                  radius: 80.50,
                  backgroundColor: Colors.transparent,
                ),
              ),
              Divider(),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 60.0),
                child: Text(
                  'Bienvenido Hermano:',
                  style: TextStyle(fontSize: 18),
                ),
              ),
              Divider(),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 60.0),
                child: Text(
                  _nombre,
                  style: TextStyle(
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
              Divider(),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 60.0),
                child: Text(
                    'Ha Ingresado a MacabeosApp, en esta app manejara su Servicio con el Ministerio Macabeos.',
                    style: TextStyle(fontSize: 18)),
              )
            ],
          ),
        ),
      ),
      bottomNavigationBar: Footer(),
    );
  }
}

Я получаю информацию с помощью этой функции:

void inputData() async {
   try {
     setState(() {
       _isLoading = true;
     });
      final FirebaseUser user = await _auth.currentUser();
      Firestore.instance
          .collection('users')
          .document(user.uid)
          .get()
          .then((value) {
        setState(() {
          _nombre = value['nombre']; 
          _isLoading = false;       
        });
      });
       setState(() {
          _isLoading = false;
        });
   } catch (err) {
        print(err);
      setState(() {
        _isLoading = false;
      });
   }
  }

А затем вызвал сборку для заполнения информации и заполнения текстового виджета переменной имени (_nombre).

См. также:  Показать пины подколлекции firebase на карте - Flutter

Проблема, которую я получаю:

════════ Исключение, обнаруженное библиотекой виджетов ══════════════════════════════ ════ Следующее утверждение было выдано при построении InitialScreen (dirty, state: _InitialScreenState # 1f7ab): непустая строка должна быть предоставлена ​​текстовому виджету. ‘package: flutter / src / widgets / text.dart’: Неудачное утверждение: строка 360, позиция 10: ‘data! = null’

введите описание изображения здесь

И когда я проверил, в чем проблема, я обнаружил, что он находится в текстовом виджете, и я предполагаю, что проблема в том, что он загружает информацию из Firebase, но все еще не готов, и он отображает красный экран, но через 5 секунд он забирает это.

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

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

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Rene Alas

    Прежде всего, вы не используете CircularProgressIndicator и на самом деле неправильно используете _isLoading.

    body: _isLoading ? Center(child: CircularProgressIndicator()) : Container(...)

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

    Вам также следует удалить _isLoading из метода сборки. Это бесполезно.

    Привет, Моя идея для _isLoading — быть флагом, в основном я хочу, чтобы во время процесса загрузки заполнения переменной значение изменилось на True, а после загрузки — False, поэтому я пытаюсь сделать в этой строке проверьте, истинно ли _isLoading, отобразите индикатор прогресса, а если оно ложно, загрузите контейнер. person Rene Alas; 31.08.2020

    Да, я это понимаю. Вы должны использовать его правильно, как я уже упоминал выше. Когда загрузка верна, будет отображаться индикатор выполнения, пока мы не получим значения из Firebase. Попробуйте это один раз. person Rene Alas; 31.08.2020

    Привет, я попробовал еще раз, но после внесения изменений получаю ту же ошибку: body: _isLoading? Центр (дочерний элемент: CircularProgressIndicator ()): Контейнер (выравнивание: Alignment.topCenter, дочерний элемент: SingleChildScrollView (дочерний элемент: Column (crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start), я добавил немного больше кода, однако, чтобы показать он по-прежнему отображает красный экран на секунду и никогда не показывает круговой индикатор прогресса. person Rene Alas; 31.08.2020

  2. Rene Alas

    ОБНОВЛЕНИЕ: мне удалось это исправить, так как кажется, что во время начальной сборки приложение искало значение в тексте из Firebase, поэтому я просто ввел состояние инициализации, чтобы оно соответствовало строке, чтобы сказать Загрузка, и это сработало. .

    Спасибо

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: