加载变量有问题。
我有一个欢迎屏幕,通过Firebase用户,我得到了用户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;
});
}
}
然后在构建中调用来填充信息,并使用Name变量(_nombre)填充文本Widget。
我遇到的问题是:
════════异常被小部件库═══════════════════════════════════捕获以下断言被抛出构建InitialScreen(脏,状态:_InitialScreenState#1f7ab):必须向文本小部件提供一个非空字符串。“包:flutter/src/widget/text.dart”:失败的断言:第360行pos 10:'data != null'
当我检查问题在哪里时,我发现它在文本Widget上,我假设问题是它正在从Firebase加载信息,它仍然没有准备好,它显示了一个红色的屏幕,但在5秒内它就把它拿走了。
我使用_isLoading变量来检查它是否正在执行来自Firebase的信息接收,我希望在填充信息时显示一个循环进度栏,或者在最坏的情况下至少不显示红色屏幕,我可以做什么?
FYI这个红色屏幕最多显示2秒或5秒,然后所有的东西都正确加载
发布于 2020-09-12 11:11:27
UPDATE:我设法修复了它,因为在初始构建过程中,应用程序wa在Firebase的文本上寻找一个值,所以我只在Initial中添加了一个字符串来表示加载,并且它成功了。
谢谢
发布于 2020-08-31 17:43:29
首先,您没有使用CircularProgressIndicator,也没有正确地使用_isLoading。
body: _isLoading ? Center(child: CircularProgressIndicator()) : Container(...)
这就是您必须如何使用进度指示符。上面的代码呈现一个文本小部件,数据在一段时间后传递,这就是红色屏幕的原因。
您还应该从build方法中删除_isLoading。这是没用的。
https://stackoverflow.com/questions/63675095
复制相似问题