Flutter FutureProvider正在阻止UI,直到Future完成

ruyhziif  于 2023-06-07  发布在  Flutter
关注(0)|答案(1)|浏览(138)

我正试图在后台加载一个excel文件,然后向用户显示其内容。我使用excel包来加载和读取它,并使用FutureProvider将数据插入小部件树。由于阅读需要相当长的时间,所以我是异步进行的。然而,每当应用程序到达包含FutureBuilder的小部件时,它就会冻结,只有在Future完成后才能继续。
阅读文件:

Future<Excel> _readExcelFile(String path) async {
  ByteData data = await rootBundle.load(path);
  var bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
  var excel = Excel.decodeBytes(bytes);

  return excel;
}

未来建设者

MultiProvider(
  providers: [
    FutureProvider(
      create: (context) async => MenuProvider().loadMenu(),
      lazy: false,
    ),
  ],
  child: MyApp(),
)

MenuProvider().loadMenu()方法调用_readExcelFile(String path)方法并解析数据。正如我所说,应用程序在启动时冻结,只有在未来完成后才继续渲染。有没有一种方法可以在不阻塞UI线程的情况下加载和解析Excel文件?或者是我唯一的选择,显示一个启动屏幕,直到数据准备好?
编辑:

@override
Widget build(BuildContext context) {
  var weekMenu = Provider.of<List<DayMenu>>(context);

  if (weekMenu != null) {
    print(weekMenu[0].date.toString());

    return PageView(
      children: [
        // PageView children
      ],
    );
  } else {
    return Text("Loading data...");
  }
}
zyfwsgd6

zyfwsgd61#

如果有人遇到这样的问题。我帮助了以下文章:
https://medium.flutterdevs.com/multithreading-in-flutter-aa07e2ae2971#:~:text= Multithreading%20allows%20for%20parallel%20execution,tasks%20at%20the%20same%20time.
分离株应该能解决问题。
或者在我的情况下,一个未来阻止了我的UI:我只是用import 'dart:async';包中的“compute”函数 Package 了它
样品:

@override
Stream<List<CameraFrameModel>> encodeJpegBytes() async* {

  List<CameraFrameModel> empty = [];

  yield empty;

  List<CameraFrameModel> res = await compute(ImageConvertCustom().convertToJpegBytes, recordedData);

  yield res;
}

相关问题