Flutter RefreshIndicator 'No data' 小部件
Flutter RefreshIndicator 'No data' Widget
我有一个 RefreshIndicator,它会在功能完成时加载 ListView,但是,我想这样做,如果功能 returns 数据集为空 - 显示另一个小部件 - 'No data'的列表视图。
我能够使用三元运算符完成此操作,但是,'No data' 小部件在刷新期间显示,直到被 ListView 替换。
如何仅在刷新完成后显示 'No data' 小部件?
这是我的代码:
return RefreshIndicator(
key: _refreshIndicatorKey,
onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
? () {
bloc.page = 1;
return bloc.getTasks(status, context).then((list) {
setState(() {
tasksList = list;
});
});
}
: () => Future.delayed(Duration(seconds: 2)),
child: tasksList.length > 0
? ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
controller: _scrollController,
itemCount: tasksList.length + 1,
itemBuilder: (context, index) {
if (index == tasksList.length) {
return _buildProgressIndicator();
} else {
Task item = tasksList != null ? tasksList[index] : null;
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TaskDetailsScreen(index, item);
},
settings: RouteSettings(
name: ScreenName.taskDetails)));
},
child: MyTasksListItem(taskData: item));
}
},
)
: Stack(children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/tumbleweed.gif',
),
]),
Positioned(
bottom: 50,
left: 0.0,
right: 0.0,
child: Align(child: Text(allTranslations.text('no_tasks'))))
]));
'No data' 小部件在我的例子中是 Stack。
也许这样的解决方案可行:
onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
? () {
setState(() {
loading = true;
});
bloc.page = 1;
return bloc.getTasks(status, context).then((list) {
setState(() {
loading = false;
tasksList = list;
});
});
}
在您的指标中 child:
child: Container(
child: loading ?
null :
tasksList.length > 0
? ListView.builder(..........
我有一个 RefreshIndicator,它会在功能完成时加载 ListView,但是,我想这样做,如果功能 returns 数据集为空 - 显示另一个小部件 - 'No data'的列表视图。
我能够使用三元运算符完成此操作,但是,'No data' 小部件在刷新期间显示,直到被 ListView 替换。
如何仅在刷新完成后显示 'No data' 小部件?
这是我的代码:
return RefreshIndicator(
key: _refreshIndicatorKey,
onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
? () {
bloc.page = 1;
return bloc.getTasks(status, context).then((list) {
setState(() {
tasksList = list;
});
});
}
: () => Future.delayed(Duration(seconds: 2)),
child: tasksList.length > 0
? ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
controller: _scrollController,
itemCount: tasksList.length + 1,
itemBuilder: (context, index) {
if (index == tasksList.length) {
return _buildProgressIndicator();
} else {
Task item = tasksList != null ? tasksList[index] : null;
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TaskDetailsScreen(index, item);
},
settings: RouteSettings(
name: ScreenName.taskDetails)));
},
child: MyTasksListItem(taskData: item));
}
},
)
: Stack(children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/tumbleweed.gif',
),
]),
Positioned(
bottom: 50,
left: 0.0,
right: 0.0,
child: Align(child: Text(allTranslations.text('no_tasks'))))
]));
'No data' 小部件在我的例子中是 Stack。
也许这样的解决方案可行:
onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
? () {
setState(() {
loading = true;
});
bloc.page = 1;
return bloc.getTasks(status, context).then((list) {
setState(() {
loading = false;
tasksList = list;
});
});
}
在您的指标中 child:
child: Container(
child: loading ?
null :
tasksList.length > 0
? ListView.builder(..........