我正试图在后台加载一个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...");
}
}
1条答案
按热度按时间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 了它样品: