首页 > 解决方案 > 未来功能超时?

问题描述

在我的应用程序中,当我按下任何按钮时,它开始显示加载屏幕,然后 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(() {});
    }

抓住(e)警告: 在此处输入图像描述

构建部分或目标页面:

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(

标签: fluttertimeouthttprequestfuture

解决方案


您可以为您的 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;
    });
}

推荐阅读