Тайм-аут для функции будущего? - PullRequest
0 голосов
/ 29 марта 2020

В моем приложении, когда я нажимаю любую кнопку, оно начинает показывать экран загрузки, а затем isLoading, равный false, создавать следующую страницу в соответствии с данными из функции loadData, оно работает, когда есть данные, но если какая-либо ошибка сервера или сети заставляет приложение складываться в на экране загрузки, я думаю, я могу поставить некоторое ограничение по времени для loadData для ожидания getData (), и actullay попытался это сделать, но я не смог получить желаемый результат, также я попытался попробовать и поймать метод в Future, все тот же результат, как я могу установить лимит времени для функции ожидания в loadData?

Конечная цель, которую я хочу достичь, заключается в следующем; когда пользователь нажал на кнопку, мое приложение отобразит экран загрузки, и, если есть данные, оно загрузит следующую страницу, но если нет никаких данных после ожидания 3-4 секунд, оно отобразит диалоговое окно с предупреждением и кнопкой, чтобы разрешить пользователю go вернуться на домашнюю страницу и повторить попытку.

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): enter image description here

сборка детали или целевой страницы:

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(

1 Ответ

1 голос
/ 29 марта 2020

Вы можете указать время ожидания для вашего запроса 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;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...