【问题标题】:Fetch data from JSON file in assets folder instead of url从资产文件夹中的 JSON 文件而不是 url 中获取数据
【发布时间】:2020-10-16 05:36:45
【问题描述】:

以下代码用于从 url 获取数据,我想将其更改为从 assets 文件夹中获取数据。

我是 Flutter 的新手,我需要你的帮助。如何将 json 文件放在本地而不是 url。

我无法考虑应该对以下代码进行哪些更改才能使其正常工作。

我试图修复它,但我无法解决,如果有人可以帮助解决这个问题,我将不胜感激。

这是我的代码:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'user.dart';

void main() {
  runApp(new MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => HomePageState();
}

List data;
List<User> userlist = List();
List<User> usersavedlist = List();
int index;

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'UserList Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('UserList Flutter'),
          actions: <Widget>[
            IconButton(icon: const Icon(Icons.list), onPressed: _pushSaved),
          ],
        ),
        body: listView(),
      ),
    );
  }

  Future<String> fetchData() async {
    final url =
        'https://raw.githubusercontent.com/highmobdevelopment/userlist/master/contacts.json';
    final response = await http.get(url);

    if (response.statusCode == 200) {
      print('succesfull parse');

      this.setState(() {
        data = json.decode(response.body);
        data.forEach((element) => userlist.add(new User.fromJson(element)));
      });
    }

    return "Success!";
  }

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  listView() {
    return ListView.builder(
      itemCount: userlist == null ? 0 : userlist.length,
      itemBuilder: (context, index) {
        return Column(
          children: <Widget>[_buildRow(index, userlist), const Divider()],
        );
      },
    );
  }

  Widget _buildRow(index, userlist) {
    final bool alreadySaved = usersavedlist.contains(userlist[index]);

    return ListTile(
      title: Text(
        userlist[index].name

请寻求您的支持以解决此问题。

【问题讨论】:

    标签: json flutter dart


    【解决方案1】:

    首先你需要在你的 pubspec.yaml 文件中声明你的 json 文件。

    assets:
        - assets/contacts.json
    

    我不确定,但是您的 fetchData() 方法必须更改为类似的内容

        Future<String> fetchData() async {
            String data = await 
            DefaultAssetBundle.of(context).loadString("assets/contacts.json");
            
           final jsonResult = json.decode(data);
           
           this.setState(() {
                jsonResult.forEach((element) => userlist.add(new User.fromJson(element)));
           });
      
        
          return "Success!";
      }
    

    更新:试试这个完整的例子:

    import 'dart:convert';
    import 'package:flutter/material.dart';
    
    class JsonFromAsset extends StatefulWidget {
      @override
      _JsonFromAssetState createState() => _JsonFromAssetState();
    }
    
    class _JsonFromAssetState extends State<JsonFromAsset> {
      List<User> userlist = [];
    
      Future<String> fetchData() async {
        String data =
            await DefaultAssetBundle.of(context).loadString("assets/contacts.json");
    
        final jsonResult = json.decode(data);
    
        this.setState(() {
          jsonResult.forEach((element) => userlist.add(new User.fromJson(element)));
        });
    
        return "Success!";
      }
    
      @override
      Widget build(BuildContext context) {
        fetchData();
        return Scaffold(
            body: Container(
                child: userlist.length > 0
                    ? ListView.builder(
                        itemCount: userlist == null ? 0 : userlist.length,
                        itemBuilder: (context, index) {
                          return Container(child: Text(userlist[index].firstName));
                        },
                      )
                    : Center(child: Text('empty'))));
      }
    }
    

    【讨论】:

    • 我在模拟器上出现空白屏幕,这意味着没有获取任何内容
    • 对我来说它正在工作。将 json 文件添加到资产并在 pubspec.yaml 中声明后,您是否完全重启了应用程序?热重载不会更新资产。
    • 我编辑了答案,看看完整的例子。至少对我来说它是有效的。也许您需要更改课堂上的其他内容。
    • 谢谢您,我尝试了您提供的完整示例,但也不起作用。我收到以下错误: 1- 名称“用户”不是类型,因此不能用作类型参数。尝试将名称更正为现有类型,或定义名为“用户”的类型。 2-未定义的类'User.fromJson'。尝试将名称更改为现有类的名称,或创建一个名为“User.fromJson”的类。
    • 嗯,这很奇怪,因为在您自己的代码中有一个 User 和一个方法 User.fromJson。你有一个名为 User 的类吗?您是否使用 URL 调用测试了问题中的代码?您唯一应该修改的是属性 userList[index].firstName 从我的示例到 userList[index].name,来自您自己的代码。
    【解决方案2】:

    您可以使用颤振服务来加载 JSON 字符串。使用下面的代码。

        import 'package:flutter/services.dart' show rootBundle;
        import 'dart:convert' as convert;
        
    //For Local JSON File
        loadJsonData()async{
        var rawString= await rootBundle.loadString('assets/config.json');
        var jsonData= convert.jsonDecode(rawString);              
        }
    
    //for Remote JSON File
    
         Future<String> fetchData() async {
         final url ='https://raw.githubusercontent.com/highmobdevelopment/userlist/master/contacts.json';
            final response = await http.get(url,headers: {"Accept": "application/json"});
        
            if (response.statusCode == 200) {
              setState(() {
                 data = convert.jsonDecode(response.body);
                 data.forEach((element) => userlist.add(new User.fromJson(element)));
              });
            }
        
            return "Success!";
          }
    

    【讨论】:

    • 如何使用此代码,请进一步解释。或修改我提供的整个代码
    • 对不起,我的代码与您给出的示例不同。如果你能修改我的代码,将不胜感激
    • 我更新了主评论代码。一次尝试新添加的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2014-03-10
    • 2014-02-14
    • 2018-02-20
    • 2014-05-16
    相关资源
    最近更新 更多