如果太长,有没有办法跳过等待? (扑)

Is there a way to skip await if it's too long? (Flutter)

我在 main 中使用 async await,因此用户在进入应用程序之前必须在启动画面中等待。

void main() async {

  await Firebase.initializeApp();

  String? x;
  await FirebaseDatabase.instance.ref().child("data").once().then((snapshot) {
     Map data = snapshot.snapshot.value as Map;
     x = jsonEncode(data);
  });

  return ChangeNotifierProvider<DataModel>.value(
     value: DataModel(data: x),
     child: MaterialApp()
  );
}

如果有用户在没有互联网连接的情况下进入应用程序,他们将永远停留在初始屏幕上。如果还有网速较慢的用户,他们会在启动画面停留更长时间。

所以不管是什么网络连接问题,我想设置最多5秒只等待,如果超过了,跳过那部分,直接进入应用程序。

您可以使用用户竞争条件或 Future.timeout

竞争条件使用 future.any

final result = await Future.any([
  YourFunction(),
  Future.delayed(const Duration(seconds: 3))
]);

在上面的代码中,第一个完成的人将给出结果, 因此,如果您的代码花费的时间超过 3 秒,那么其他函数将 return 回答

将您的 Firebase api 调用传递给函数,使方法 return 成为未来,

Future<String?> getData() async {
await FirebaseDatabase.instance.ref().child("data").once().then((snapshot) {
     Map data = snapshot.snapshot.value as Map;
     return jsonEncode(data);
  });
}

然后在 main 方法上,为您创建的方法附加超时

void main() async {

  await Firebase.initializeApp();

  String? x = await getData().timeout(Duration(seconds: 5), onTimeout: () { 
  return null };

  return ChangeNotifierProvider<DataModel>.value(
     value: DataModel(data: x),
     child: MaterialApp()
  );
}

所以如果你 api 花费超过 5 秒的时间,然后它退出并且 return null