Я создал приложение-флаттер, которое получает данные из нескольких источников, из базы данных пожарного магазина и из некоторых HTTP-вызовов API. Я знаю, что вам нужно время для загрузки этих данных в приложение, поэтому я построил свои виджеты на FutureBuilder()
Однако иногда снимок уже возвращает данные до загрузки всех данных. Может кто-нибудь помочь сделать анимацию загрузчика длиннее, чтобы мой пользовательский интерфейс не выходил из строя. Большое спасибо.
Вот мой основной виджет:
Widget build(BuildContext context) {
print('this is homelist length: $homeList');
return Scaffold(
backgroundColor: AppTheme.white,
body: FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 3,
),
);
} else {
return Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
appBar(),
Expanded(
child: FutureBuilder(
future: getData2(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 3,
),
);
} else {
return homeList.isEmpty == false
? GridView(
padding: EdgeInsets.only(
top: 0, left: 12, right: 12),
physics: BouncingScrollPhysics(),
scrollDirection: Axis.vertical,
children: List.generate(
homeList.length,
(index) {
var count = homeList.length;
var animation =
Tween(begin: 0.0, end: 1.0).animate(
CurvedAnimation(
parent: animationController,
curve: Interval(
(1 / count) * index, 1.0,
curve: Curves.fastOutSlowIn),
),
);
animationController.forward();
return HomeListView(
animation: animation,
animationController:
animationController,
listData: homeList.elementAt(index),
callBack: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => homeList
.elementAt(index)
.navigateScreen,
),
);
},
);
},
),
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: multiple ? 2 : 1,
mainAxisSpacing: 12.0,
crossAxisSpacing: 12.0,
childAspectRatio: 1.5,
),
)
: Container(
margin: EdgeInsets.all(12),
child: Column(
children: <Widget>[
SizedBox(
height: 30,
),
Container(
decoration: BoxDecoration(
color: AppTheme.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.0),
bottomLeft: Radius.circular(8.0),
bottomRight: Radius.circular(8.0),
topRight: Radius.circular(8.0)),
boxShadow: <BoxShadow>[
BoxShadow(
color: AppTheme.grey
.withOpacity(0.8),
offset: Offset(1.1, 1.1),
blurRadius: 10.0),
],
),
child: Column(
children: <Widget>[
Text(
'Welcome to DiabeatIS, your patients will be displayed here!',
style: AppTheme.headline,
textAlign: TextAlign.justify),
Divider(
color: Colors.black,
),
SizedBox(
height: 15,
),
Text(
'Simply ask your patient for their code, and click the button below, you will be taken to a screen where you can add your patients, and view their data afterwards!',
style: AppTheme.subtitle,
textAlign: TextAlign.justify,
),
RaisedButton(
child: Text('Add Patients'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
AddPatient()));
},
)
],
),
),
],
),
);
}
},
),
),
],
),
);
}
},
),
);
}
Вот функция для моего FutureBuilder:
Future<bool> getData2() async {
await Future.delayed(Duration(milliseconds: 200));
return true;
}
Future<bool> getData() async {
_getCurrentUser();
await Future.delayed(const Duration(milliseconds: 1000), () async {
_getPatients(); // a function that involves two queries
});
return true;
}
Получить функцию пациента:
Future<bool> _getPatients() async {
homeList.clear();
if (didLoadpatients == 0) {
print('this is didloadpatients at start of func $didLoadpatients');
var document = await db
.collection('users')
.document(mUser.uid)
.collection('patients');
document.getDocuments().then((QuerySnapshot query) async {
query.documents.forEach((f) {
uids.add(f.data['uID']);
});
didLoadpatients++;
print('this is didloadpatients at end of func $didLoadpatients');
for (var i = 0; i < uids.length; i++) {
var userDocuments = await db.collection('users').document(uids[i]);
userDocuments.get().then((DocumentSnapshot doc) {
homeList.add(HomeList(
imagePath: 'assets/fitness_app/fitness_app.png',
navigateScreen: DVFitnessAppHomeScreen(
uid: doc.data['userID'],
),
patientInfo: new PatientInfo.fromFbase(doc.data)));
});
print(homeList);
}
print(homeList);
var document = await db
.collection('users')
.document(mUser.uid)
.collection('notifications')
.where('hasbeenViewed', isEqualTo: false)
.getDocuments();
final List<DocumentSnapshot> notifDoc = document.documents;
notifications = notifDoc.length;
await Future.delayed(Duration(milliseconds: 800));
return true;
});
} else
print('I am leaving the get patient function');
await Future.delayed(Duration(milliseconds: 800));
return true;
}