В моем приложении, когда я нажимаю любую кнопку, оно начинает показывать экран загрузки, а затем 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):
сборка детали или целевой страницы:
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(