在flutter项目中列出本地json数据

Posted

技术标签:

【中文标题】在flutter项目中列出本地json数据【英文标题】:Listing local json data in flutter project 【发布时间】:2021-08-02 22:37:05 【问题描述】:

我正在尝试在我的移动应用中列出药物清单。我的数据在本地 json 文件中。


        "BARKOD": 8699755640016,
        "ATC KODU": "A01AA",
        "ATC ADI": "Caries prophylactic agents",
        "REFERANS \nE�DE�ER": "E�DE�ER",
        "ESDEGERI": 2,
        "ILAC ADI": "SENSORAL 250 ML SOLUSYON",
        "ETKIN MADDE": "POTASYUM NITRAT + SODYUM KLORUR",
        "FIRMA ADI": "DENTORAL MEDIFARMA",
        "BIRIM MIKTAR": "",
        "BIRIM CINSI": "",
        "AMBALAJ MIKTARI": 250,
        "RE�ETE": "NORMAL RE�ETE",
        "KDV DAHIL PERAKENDE SATIS TL FIYATI \n1 ? =2,1166 TL": "5,69"
    ,

其中一个是这样的。 当我点击一个按钮时,我试图让所有这些数据出现。我的代码如下。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:medicine_reminder/src/ui/homepage/homepage.dart';

class JsonPage extends StatefulWidget 
  @override
  _JsonPageState createState() => _JsonPageState();


class _JsonPageState extends State<JsonPage> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text("Medicine List"),
        centerTitle: true,
      ),
      body: Center(
        child: FutureBuilder(
          builder: (context, snapshot) 
            var showData = json.decode(snapshot.data.toString());
            return ListView.builder(
              itemBuilder: (BuildContext context, int index) 
                return ListTile(
                isThreeLine: true,
                title: Text(showData[index]['ILAC ADI']),
                subtitle: Text(showData[index]['ETKIN MADDE']),
                
                );
              ,
              itemCount: showData.length,
            );
          ,
          future:
              DefaultAssetBundle.of(context).loadString("assets/csvjson.json"),
        ),
      ),
      floatingActionButton: Stack(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(right: 1),
            child: Align(
              heightFactor: 12.9,
              alignment: Alignment.topLeft,
              child: FloatingActionButton(
                onPressed: () 
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => HomePage(),
                      ));
                ,
                child: Icon(Icons.arrow_back),
              ),
            ),
          ),
        ],
      ),
    );
  


但我无法获得所有字段,我只能获得 2 个字段“ILAC ADI”和“ETKIN MADDE”。 我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

只有'ILAC ADI''ETKIN MADDE' 显示在屏幕上,因为您只在ListTile 中提供了这些值。

您可以使用Column 代替ListTile 来显示所有数据。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:medicine_reminder/src/ui/homepage/homepage.dart';

class JsonPage extends StatefulWidget 
  @override
  _JsonPageState createState() => _JsonPageState();


class _JsonPageState extends State<JsonPage> 
  // This List stores all the keys in the JSON
  final List<String> jsonKeyList = [
    'BARKOD',
    'ATC KODU',
    'ATC ADI',
    'REFERANS \nE�DE�ER',
    'ESDEGERI',
    'ILAC ADI',
    'ETKIN MADDE',
    'FIRMA ADI',
    'BIRIM MIKTAR',
    'BIRIM CINSI',
    'AMBALAJ MIKTARI',
    'RE�ETE',
    'KDV DAHIL PERAKENDE SATIS TL FIYATI \n1 ? =2,1166 TL',
  ];

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text("Medicine List"),
        centerTitle: true,
      ),
      body: Center(
        child: FutureBuilder(
          builder: (context, snapshot) 
            var showData = json.decode(snapshot.data);
            print(showData.toString());
            return ListView.builder(
              itemBuilder: (BuildContext context, int index) 
                // Used column to show all the values in the JSON
                return Column(
                  children: jsonKeyList.map((key) 
                    return Text(showData[index][key].toString());
                  ).toList(),
                );
              ,
              itemCount: showData.length,
            );
          ,
          future:
              DefaultAssetBundle.of(context).loadString("assets/csvjson.json"),
        ),
      ),
      floatingActionButton: Stack(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(right: 1),
            child: Align(
              heightFactor: 12.9,
              alignment: Alignment.topLeft,
              child: FloatingActionButton(
                onPressed: () 
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => HomePage(),
                      ));
                ,
                child: Icon(Icons.arrow_back),
              ),
            ),
          ),
        ],
      ),
    );
  

如果您有任何疑问,请发表评论。

【讨论】:

【参考方案2】:

处理和渲染 json 数据最有效的方法是创建模型。如果您不熟悉此QuickType 可以帮助您解决此问题。

粘贴您的 json,您将获得模型的代码。接下来,您可以使用您的 json 数据实例化模型并使用 ListView.builder 迭代您的模型并呈现数据。

Retroportal studio 有一个很好的视频来解释这个概念,看看。我相信它会帮助你。

【讨论】:

以上是关于在flutter项目中列出本地json数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?

如何在flutter中本地获取json文件中的json数据

无法在 Flutter 中加载本地 JSON 文件

Flutter 如何从 JSON 中列出具有多个子项的数组

在 Flutter 中编码/解码复杂的 Json

Flutter:如何调用本地 JSON 数据并动态添加到标签栏?