如何从 SDCARD 中的文件解析 json



我是颤振和应用程序开发的新手。我正在制作一个离线字典应用程序,该应用程序从手机内存中读取 json 文件并在应用程序容器中解析它。我可以通过在应用程序中捆绑 json 来做到这一点,但在从手机内存中获取文件时面临问题。这是读取文件的代码:-

Future<Null> fetchData() async {
setState(() {
loading = true;
});
_list.clear();
final response = await rootBundle.loadString("${widget.value}");
//    final response = await rootBundle.loadString('assets/abvn.json');
final data = jsonDecode(response);
setState(() {
for (Map i in data) {
_list.add(Posts.formJson(i));
loading = false;
}
});
}

这里 ${widget.value} 给出了手机内存中 json 的绝对路径。 注释行用于解析应用程序中捆绑的 JSON,工作正常。我得到的错误:-

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Unable to load asset: /storage/emulated/0/Download/test2.json
E/flutter ( 5719): #0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:221:7)
E/flutter ( 5719): <asynchronous suspension>
E/flutter ( 5719): #1      AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:67:33)
E/flutter ( 5719): #2      CachingAssetBundle.loadString.<anonymous closure> (package:flutter/src/services/asset_bundle.dart:162:56)
E/flutter ( 5719): #3      _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:293:23)
E/flutter ( 5719): #4      CachingAssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:162:27)
E/flutter ( 5719): #5      _dicState.fetchData (package:abvnsearch/main.dart:173:39)
E/flutter ( 5719): #6      _dicState.initState (package:abvnsearch/main.dart:204:5)
E/flutter ( 5719): #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4640:58)
E/flutter ( 5719): #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
E/flutter ( 5719): #9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #10     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #11     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5830:14)
E/flutter ( 5719): #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #13     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #14     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter ( 5719): #15     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter ( 5719): #16     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
E/flutter ( 5719): #17     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
E/flutter ( 5719): #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #20     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5830:14)
E/flutter ( 5719): #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #22     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #23     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5830:14)
E/flutter ( 5719): #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #25     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #26     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter ( 5719): #27     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter ( 5719): #28     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter ( 5719): #29     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
E/flutter ( 5719): #30     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4666:11)
E/flutter ( 5719): #31     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
E/flutter ( 5719): #32     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #34     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5830:14)
E/flutter ( 5719): #35     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #36     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #37     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5830:14)
E/flutter ( 5719): #38     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
E/flutter ( 5719): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
E/flutter ( 5719): #40     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter ( 5719): #41     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter ( 5719): #42     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter ( 5719): #43     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
E/flutter ( 5719): #44     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4666:11)
E/flutter ( 5719): #45     ComponentElement.m

您可以复制粘贴运行下面的
完整代码 正如日志文件所说,我假设文件位于Download文件夹中

Unable to load asset: /storage/emulated/0/Download/test2.json

第 1 步:将权限READ_EXTERNAL_STORAGE添加到 AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

步骤 2:添加包ext_storagepermission_handler通知版本4.4.0

dependencies:
flutter:
sdk: flutter
ext_storage: any
permission_handler: 4.4.0

步骤 3:使用以下代码请求权限和访问文件

void _fetchData() async {
String path = await ExtStorage.getExternalStoragePublicDirectory(
ExtStorage.DIRECTORY_DOWNLOADS);
print(path);
File file = await File('$path/test2.json');
String contents = await file.readAsString();
print(contents);
setState(() {
_counter++;
});
}
void requestPermission() {
PermissionHandler().requestPermissions([PermissionGroup.storage]);
}
@override
void initState() {
requestPermission();
super.initState();
}

完整代码

import 'package:flutter/material.dart';
import 'package:ext_storage/ext_storage.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _fetchData() async {
String path = await ExtStorage.getExternalStoragePublicDirectory(
ExtStorage.DIRECTORY_DOWNLOADS);
print(path);
File file = await File('$path/test2.json');
String contents = await file.readAsString();
print(contents);
setState(() {
_counter++;
});
}
void requestPermission() {
PermissionHandler().requestPermissions([PermissionGroup.storage]);
}
@override
void initState() {
requestPermission();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _fetchData,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}

最新更新