flutter - 未来功能超时?
问题描述
在我的应用程序中,当我按下任何按钮时,它开始显示加载屏幕,然后 isLoading 等于 false 根据 loadData 函数的数据制作下一页,它在有数据时工作,但如果任何服务器或网络错误使应用程序堆叠在加载屏幕中,我想我可以为 loadData 设置一些时间限制以等待 getData() 结果,actullay 尝试过,但我无法得到我想要的结果,我也尝试了 Future 中的 try and catch 方法仍然是相同的结果,我该如何设置时间限制loadData 中的等待函数?
我想达到的最终目标是;当用户单击按钮时,我的应用程序将显示加载屏幕,如果有数据,它将加载下一页,但如果在等待 3-4 秒后没有任何数据,那么它将显示一个带有警告的警告对话框和一个允许按钮让用户返回主页并重试。
Future<Payload> getData(String name) async{
String myUrl = 'http://anywhere.com/query?$name';
http.Response response = await http.get(myUrl);
return payloadFromJson(response.body);
}
和
void loadData() async {
payload = await getData(_name);
isLoading = false;
firstRun = true;
setState(() {});
}
构建部分或目标页面:
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
static String routeName = "/MyHomePage";
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();}
class _MyHomePageState extends State<MyHomePage> {
final GlobalKey<InnerDrawerState> _innerDrawerKey = GlobalKey<InnerDrawerState>();
bool isLoading = true;
String _name = "";
void loadData() async {
payload = await getData(_name);
isLoading = false;
firstRun = true;
setState(() {});
}
void updateName(String name) {
setState(() {
isLoading = true;
this._name = name;
loadData();
});
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
loadData();
WidgetsBinding.instance.addPostFrameCallback((_) =>
_refreshIndicatorKey.currentState.show());
getNamePreferences().then(updateName);
});
}
@override
Widget build(BuildContext context) {
ListTile _createTile(BuildContext context, String name, IconData icon,
Function action) {
return ListTile(
leading: Icon(icon),
title: Text(name),
onTap: () {
Navigator.pop(context);
action();
},
);
}
_action() {
print('action');
}
return isLoading ? Center(
和第一页:
class MyFirstPage extends StatefulWidget {
@override
_MyFirstPageState createState() => new _MyFirstPageState();
}
class _MyFirstPageState extends State<MyFirstPage> {
TextEditingController nameController = TextEditingController();
bool isLoggedIn = false;
String name = '';
bool firstRun = true;
@override
void initState() {
// TODO: implement initState
super.initState();
autoLogIn();
}
Future<Null> loginUser() async{...}
Future<Null> logout() async{...}
void autoLogIn() async{...}
void changeBrightness(){...}
void showChooser(){...}
void showGenre(){...}
void showSimilar(){...}
@override
Widget build(BuildContext context) {
return new Scaffold(
解决方案
您可以为您的 http 请求指定超时。
http.Response response = await http.get(myUrl).timeout(const Duration(seconds: 10));
您必须处理TimeoutException
停止加载指示器:
try {
payload = await getData(_name);
// Remaining code
} on TimeoutException catch (e) {
setState(() {
isLoading = false;
});
}
推荐阅读
- linux - 在 Fedora Linux 上安装 .NET 框架开发包
- amazon-ec2 - 如何在模板化字符串时修复模板错误:没有使用分子 ec2 驱动程序命名为“molecule_from_yaml”的过滤器
- materialize - 将 Sass 版本的 MaterialCSS 或 Bulma 集成到 Svelte
- java - Java文件未显示在android studio中
- javascript - Angular8 ngFor子数据绑定不呈现
- c++ - 如何使用 QSortFilterProxyModel 按字母顺序对列表项进行排序?
- flutter - Flutter Light / Dark Mode 事件 / 通知
- python - Python input() 在输入 ENTER 后不起作用 - PyCharm
- environment-variables - 如何使用特定于 GITLAB 分支的不同变量值
- c# - “CS1513 } 预期”当我已经有一个 }