У меня проблема с загружаемой переменной.
У меня есть экран приветствия, который проходит через 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).
Проблема, которую я получаю:
════════ Исключение, обнаруженное библиотекой виджетов ══════════════════════════════ ════ Следующее утверждение было выдано при построении InitialScreen (dirty, state: _InitialScreenState # 1f7ab): непустая строка должна быть предоставлена текстовому виджету. ‘package: flutter / src / widgets / text.dart’: Неудачное утверждение: строка 360, позиция 10: ‘data! = null’
И когда я проверил, в чем проблема, я обнаружил, что он находится в текстовом виджете, и я предполагаю, что проблема в том, что он загружает информацию из Firebase, но все еще не готов, и он отображает красный экран, но через 5 секунд он забирает это.
Я использовал переменную _isLoading, чтобы проверить, выполняет ли она прием информации от Firebase, и я хочу отображать круговую полосу выполнения, пока информация заполняется, или, в худшем случае, по крайней мере, не отображать красный экран, что я мог сделать?
К вашему сведению, этот красный экран отображается максимум 2 или 5 секунд, после чего все загружается правильно
Прежде всего, вы не используете 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
ОБНОВЛЕНИЕ: мне удалось это исправить, так как кажется, что во время начальной сборки приложение искало значение в тексте из Firebase, поэтому я просто ввел состояние инициализации, чтобы оно соответствовало строке, чтобы сказать Загрузка, и это сработало. .
Спасибо