У меня проблема с загружаемой переменной.
У меня есть экран приветствия, который проходит через 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 секунд, после чего все загружается правильно
