在 FutureBuilder 中使用之前使用 getApplicationDocumentsDirectory() 获取路径

问题描述 投票:0回答:1

在这个 Flutter 应用程序中,我想构建一个带有缩略图的项目列表,这些缩略图作为文件名存储在数据库中。文件存储在应用程序的目录中,只有名称保存在数据库中。

当我构建列表时,我想获取应用程序的目录,然后将其与文件名一起加入。但我不知道该怎么做,因为

getApplicationDocumentsDirectory()
是异步的,当我需要它时它不返回值(在使用
ListView.builder
之前)

我的代码,让它更清晰

class _ItemsWidgetState extends State<ItemsWidget> {
  String? appDir;

  @override
  void initState() {
    // this seems like the only place where I can get it
    getApplicationDocumentsDirectory().then((value) => appDir = value.path);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: widget.items,
        initialData: const [],
        builder: (context, snapshot) {
          return snapshot.hasData && snapshot.data!.isNotEmpty
              ? ListView.builder(
                  itemCount: snapshot.data?.length,
                  itemBuilder: (_, int index) {
                    final Item item = snapshot.data![index];
                    // $aappDir is NULL here
                    return ListTile(
                      leading: Image.file(File('$appDir/${item.thumbnailName}')),
                      title: Text(item.name,),
                    );
                  })
              : Center(child: Text('No items added'),),
          );
        });
  }
}

如您所见,

appDir
为空并且
initState()
不会更改它,即使它确实获取了目录。我需要更好地理解它是如何工作的以及我怎样才能使它工作

flutter asynchronous path flutter-futurebuilder
1个回答
0
投票

尝试如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // <-- This can save your life
  final Directory documentDirectory = await getApplicationDocumentsDirectory();
  print (documentDirectory);

  runApp(_App());
}
© www.soinside.com 2019 - 2024. All rights reserved.