如何从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
chunhunghan

您可以在下面复制粘贴运行完整代码
正如日志文件所说,我假设文件位于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),
      ),
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章