我正试图在后台加载一个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;
}
FutureBuilder
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...");
}
}
如果有人面临这样的问题。我帮助了以下文章:
https://medium.flutterdevs.com/multithreading-in-flutter-aa07e2ae2971#:~:text=多线程%20允许%20并行%20执行,任务%20在%20相同的%20时间执行。
隔离物应该能起作用。
或者在我的情况下,一个Future阻塞了我的UI:我只是用";计算";来自包import 'dart:async';
的功能
样品:
@override
Stream<List<CameraFrameModel>> encodeJpegBytes() async* {
List<CameraFrameModel> empty = [];
yield empty;
List<CameraFrameModel> res = await compute(ImageConvertCustom().convertToJpegBytes, recordedData);
yield res;
}