如何在应用程序重新启动时从内部存储检索选择的文件并在 Listview Builder 中显示?

How to retrieve picked files on app restart from Internal Stroage and show in Listview Builder in flutter?

我是 Flutter 的新手,每次我重新启动我的 Flutter 应用程序时,我都无法读取选择的文件,它们都不见了 例如,如果我选择一个图像或一个 pdf 文件并在列表视图中显示它的 fine.But 当我重新启动应用程序时它们就消失了如何解决这个问题?谢谢

简而言之,请告诉我如何在我的 flutter 应用程序中保存文件。 这是我的代码中的一个简短示例

    Widget show({
    required List<PlatformFile> files,
  }) {
    return ListView.builder(
      itemCount: files.length,
      itemBuilder: (context, index) {
        final file = files[index];
        return buildFile(file, context);
      },
    );
  }
 Widget buildFile(PlatformFile file, BuildContext context) {
        return Container(
          color: Colors.white,
          child: InkWell(
            onTap: () {
              print("File Path is ${file.path}");
              Navigator.pushReplacement(context,
                  MaterialPageRoute(builder: (context) {
                return OpenImage(pathPDF: file.path!);
                //open viewPDF page on click
              }));
            },
            child: Container(
              height: 100,
              width: 150,
              color: Colors.white,
              child: ListTile(
                leading: (file.extension == 'jpg' ||
                        file.extension == 'jpeg' ||
                        file.extension == 'png')
                    ? Image.file(
                        File(file.path.toString()),
                        fit: BoxFit.cover,
                      )
                    : Container(
                        width: 100,
                        height: 100,
                      ),
                title: Text(
                  '${file.name.substring(0, idx).trim()}',
                  style: TextStyle(
                    fontFamily: GoogleFonts.lato().fontFamily,
                  ),
                ),
                  ],
                ),
              ),
            ),
          ),
        );
      }

要从设备保存和检索数据,您可以使用 Shared Preferences

尽管在 prefs.setString("gotPath", file!.path.toString()); 上缺少 await,但您在选择文件时正确保存了第一个文件的路径。

Future<void> readPath() async {
  final preferences = await SharedPreferences.getInstance();
  final path = preferences.getString('gotPath');
}

通过这种方式,您可以检索保存到设备的路径。请注意,此函数是异步的,因此您可以使用未来的构建器来等待它。

由于您需要将整个文件列表保存到设备,因此我提供了一个示例,说明如何使用 getStringListsetStringList:

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  late final Future<void> _loadFileFuture = _loadFiles();

  Future<void> _loadFiles() async {
    final _prefs = await SharedPreferences.getInstance();
    final _files = _prefs.getStringList('files');
  }

  Future<void> _saveFiles() async {
    final _prefs = await SharedPreferences.getInstance();
    final _retrievedFiles =
        await _prefs.setStringList('files', _files);

    _files.addAll(_retrievedFiles);
  }

  final List<String> _files = [];

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _loadFileFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState != ConnectionState.done) {
            return CircularProgressIndicator();
          }
          return ListView.builder();
        });
  }
}