我主要使用async wait,因此用户在进入应用程序之前必须在启动屏幕中等待.

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秒的等待时间,如果超过,跳过该部分,直接进入应用程序.

推荐答案

将Firebase api调用传递给函数,使该方法返回future ,

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秒以上的时间,那么它将退出并返回null

Flutter相关问答推荐

无法在Flatter中设计正确的布局

使用自定义控制器将项插入到ListView中时行为不正确

使小部件处于有状态状态会导致hasSize异常

将Riverpods NotifierProvider与State类一起使用

无法在仿真器上运行Flutter 项目-文件名太长错误

在 flutter 吧蜂巢中拯救主题

如何在Flutter Webview包中触发基于URL导航的事件

Riverpod 2.0-如何使用FutureOr和AutoDisposeSyncNotificationer处理api状态代码?

Flutter 中的区域不匹配

在flutter中从图库或相机中 Select 图像的方法

如何在Flutter中动态绘制一条从A点到B点的线?

Firebase Auth - 有没有办法为新用户预先生成 UID?

ListView 后台可见

忽略异步函数上的 context.mounted 访问 linting 错误是否安全?

如何更改中心的圆形进度指示器

Getx Flutter 在更新值时抛出空错误

如何使用列Flutter 中文本占用的空间来控制svg宽度

为什么容器会填满整个空间?

Textfield 和 MasonryGrid 给出错误(垂直视口的高度没有限制)

未处理的异常:FileSystemException:无法打开文件,路径 = 'assets/res.zip'(操作系统错误:没有这样的文件或目录,errno = 2)