如何遍历属于键值的对象数组-Flutter

我有一个称为锚的数据列表,它具有指向详细屏幕的链接。每个锚都有分布中心,分布中心是嵌套对象的数组。因此,我能够将每个锚点的ID解析到一个详细的屏幕,而

面临一个挑战,即要遍历子项(即锚点的分发中心)。请任何人帮助我,我能够将属于锚的所有值拉到详细屏幕,但是如何在详细屏幕中循环嵌套值是一个问题。嵌套值是下面数组中的DistributionCentres。请任何人可以帮助我进一步学习颤振吗?

json数组:

{

"Anchors": [

{

"Oid": 11,

"Name": "MAIZE ASSOCIATION OF NIGERIA",

"Acronym": "MAAN",

"DistributionCentres": [

{

"Oid": 11,

"Name": "Logo Centre (Zone A)",

"Address": "Private Warehouse, Ugba, Logo LGA"

},

{

"Oid": 12,

"Name": "Makurdi Centre (Zone B)",

"Address": "Ministry of Agric, Makurdi "

},

{

"Oid": 13,

"Name": "Oturkpo Centre (Zone C)",

"Address": "Private Warehouse, Oturkpo"

},

{

"Oid": 15,

"Name": "Borno MAAN centre",

"Address": "Bolori Store, Flavour Mill, Behind Vita Foam, Maiduguri"

},

{

"Oid": 18,

"Name": "Bauchi Centre",

"Address": "BASPD, Dass Road, Bauchi"

}

],

"NoOfDistributionCentres": 5

},

{

"Oid": 2,

"Name": "MAIZE GROWERS, PROCESSORS AND MARKETERS ASSOCIATION OF NIGERIA",

"Acronym": "MAGPAMAN",

"DistributionCentres": [

{

"Oid": 2,

"Name": "Guma Centre",

"Address": "P 32, 2nd Avenue Federal Housing Estate, N/Bank, Makurdi"

},

{

"Oid": 3,

"Name": "Logo Centre",

"Address": "Terhemen Akema Storage Facility, Ugba, Logo LGA"

},

{

"Oid": 5,

"Name": "Oturkpo Centre",

"Address": "Grain Store, Lower Benue Okele Project, Otukpo"

},

{

"Oid": 6,

"Name": "Gboko Centre",

"Address": "K3 New Road, Opposite former coca cola plant. Solar Schools Street, Gboko"

},

{

"Oid": 7,

"Name": "Gwer East Centre",

"Address": "Ahua Shardye's Warehouse, Behind Sylkan Filling Station, Ikpayongo , G/East LGA"

},

{

"Oid": 8,

"Name": "Kwande Centre",

"Address": "KM 3, Adagi Road, Adikpo"

},

{

"Oid": 9,

"Name": "Ohimini Centre",

"Address": "Ajoga Oglewu, Ohimini"

},

{

"Oid": 10,

"Name": "Oju Centre",

"Address": "Behind Town Hall, Ohuhu owo, Oju LGA"

}

],

"NoOfDistributionCentres": 8

}

],

}

锚点页面,其中包含指向详细屏幕的链接:

import 'package:erg_app/AnchorDetails.dart';

import 'package:erg_app/Details.dart';

import 'package:erg_app/StockPage.dart';

import 'package:flutter/material.dart';

import 'package:erg_app/Widgets/nav-drawer.dart';

import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MaterialApp(

home: AnchorsPage(),

));

class AnchorsPage extends StatefulWidget {

@override

_MyHomeState createState() => _MyHomeState();

}

class _MyHomeState extends State<AnchorsPage> {

var user;

var userData;

List <dynamic> anchors = [];

@override

void initState() {

_getUserAnchor();

super.initState();

}

_getUserAnchor() async {

SharedPreferences localStorage = await SharedPreferences.getInstance();

var userJson = localStorage.getString('loginRes');

user = json.decode(userJson);

setState(() {

anchors = user['Anchors'];

});

print(anchors);

setState(() {

userData = anchors;

});

}

@override

Widget build(BuildContext context) {

return Scaffold(

drawer: NavDrawer(),

appBar: AppBar(

title: Text('Anchors Details'),

iconTheme: IconThemeData(color: Colors.white),

backgroundColor: Colors.green,

),

body: Container(

padding: const EdgeInsets.fromLTRB(10, 30, 10, 10),

child: ListView(

children: <Widget>[

Row(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: <Widget>[

Icon(Icons.card_membership,

size: 35, color: Colors.orange[400]),

Text(

'Assigned Anchors',

style: TextStyle(color: Colors.orange[400], fontSize: 25),

),

],

),

ListView.builder(

shrinkWrap: true,

itemCount: anchors.length,

physics: NeverScrollableScrollPhysics(),

itemBuilder: (BuildContext context, int i) {

return Padding(

padding: const EdgeInsets.all(10.0),

////////////// 1st card///////////

child: Card(

elevation: 4.0,

color: Colors.grey[100],

margin: EdgeInsets.only(

left: 10, right: 10, top: 20, bottom: 10),

shape: RoundedRectangleBorder(

borderRadius: BorderRadius.circular(10)),

child: Container(

padding: EdgeInsets.only(left: 15, top: 20, bottom: 10),

width: MediaQuery.of(context).size.width,

child: Column(

crossAxisAlignment: CrossAxisAlignment.start,

children: <Widget>[

Row(

children: <Widget>[

Padding(

padding: const EdgeInsets.all(8.0),

child: Container(

width: 50.0,

height: 50.0,

decoration: new BoxDecoration(

shape: BoxShape.circle,

image: new DecorationImage(

fit: BoxFit.cover,

image: AssetImage(

'assets/images/user.png')))),

),

SizedBox(

width: 20,

),

Text(

anchors[i]['Acronym'],

textAlign: TextAlign.center,

style: TextStyle(

color: Color(0xFF9b9b9b),

fontSize: 20,

decoration: TextDecoration.none,

fontWeight: FontWeight.normal,

),

),

],

),

Container(width: 10),

Row(

children: <Widget>[

Padding(

padding:

const EdgeInsets.only(left: 10, top: 10),

child: Text(

'Allocated Farmers:',

textAlign: TextAlign.left,

style: TextStyle(

color: Color(0xFF9b9b9b),

fontSize: 14.0,

decoration: TextDecoration.none,

fontWeight: FontWeight.normal,

),

),

),

Padding(

padding:

const EdgeInsets.only(left: 70, top: 12),

child: Text(

anchors[i]['Oid'].toString(),

textAlign: TextAlign.left,

style: TextStyle(

color: Colors.grey[700],

fontSize: 14.0,

decoration: TextDecoration.none,

fontWeight: FontWeight.normal,

),

),

),

],

),

Container(

height: 20,

),

Row(

children: <Widget>[

/////////// Buttons /////////////

Padding(

padding: const EdgeInsets.all(10.0),

child: FlatButton(

child: Padding(

padding: EdgeInsets.only(

top: 8,

bottom: 8,

left: 10,

right: 8),

child: Text(

'View Details',

textDirection: TextDirection.ltr,

style: TextStyle(

color: Colors.white,

fontSize: 15.0,

decoration: TextDecoration.none,

fontWeight: FontWeight.normal,

),

),

),

color: Colors.blueGrey,

shape: new RoundedRectangleBorder(

borderRadius:

new BorderRadius.circular(

20.0)),

onPressed: () {

Navigator.push(

context,

new MaterialPageRoute(

builder: (context) =>

detailsPage(value : anchors)));

},

),

),

/////////// End of Buttons /////////////

],

),

],

),

),

),

);

})

],

),

),

);

}

}

详细画面:

  import 'package:flutter/material.dart';

class detailsPage extends StatefulWidget {

dynamic value;

detailsPage({Key key, @required this.value}) : super(key: key);

@override

_detailsPageState createState() => _detailsPageState(value);

}

class _detailsPageState extends State<detailsPage> {

dynamic value;

_detailsPageState(this.value);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text("Anchors Details Page"),

iconTheme: IconThemeData(color: Colors.white),

backgroundColor: Colors.green,

),

// body: Center(

// child: Text(

// value[1]['Name'].toString(),

// ),

// ),

body: Column(

children: <Widget>[

Padding(

padding: const EdgeInsets.all(8.0),

child: Card(

child: Column(

children: <Widget>[

Text(value[1]['Name']),

Text(value[1]['Oid'].toString()),

//Text(value [1]['DistributionCentres']),

],

),

),

),

],

),

);

}

}

回答:

我建议您在这种情况下使用数据类。

import 'package:flutter/material.dart';

List<Anchor> _parseAnchors(Map<String, dynamic> map) {

final anchors = <Anchor>[];

for (var anchorMap in map['Anchors']) {

final anchor = Anchor.fromMap(anchorMap);

anchors.add(anchor);

}

return anchors;

}

class Anchor {

final int oId;

final String name;

final String acronym;

final List<DistributionCenter> distributionCenters;

const Anchor({

@required this.oId,

@required this.name,

@required this.acronym,

@required this.distributionCenters,

});

factory Anchor.fromMap(Map<String, dynamic> map) {

final distributionCenters = <DistributionCenter>[];

for (var distribution in map['DistributionCentres']) {

final distributionCenter = DistributionCenter.fromMap(distribution);

distributionCenters.add(distributionCenter);

}

return Anchor(

oId: map['Oid'] as int,

name: map['Name'] as String,

acronym: map['Acronym'] as String,

distributionCenters: distributionCenters,

);

}

}

class DistributionCenter {

final int id;

final String name;

final String address;

const DistributionCenter({

@required this.id,

@required this.name,

@required this.address,

});

factory DistributionCenter.fromMap(Map<String, dynamic> map) {

return DistributionCenter(

id: map['Oid'] as int,

name: map['Name'] as String,

address: map['Address'] as String,

);

}

}

class AnchorPage extends StatelessWidget {

// details page

final Anchor anchor;

@override

const AnchorPage({Key key, @required this.anchor}) : super(key: key);

Widget build(BuildContext context) {

return Scaffold(

body: Container(

child: Text(anchor.name),

),

);

}

}

class AnchorsPage extends StatefulWidget {

const AnchorsPage({Key key}) : super(key: key);

@override

_AnchorsPageState createState() => _AnchorsPageState();

}

class _AnchorsPageState extends State<AnchorsPage> {

static const anchorsMap = {

"Anchors": [

{

"Oid": 11,

"Name": "MAIZE ASSOCIATION OF NIGERIA",

"Acronym": "MAAN",

"DistributionCentres": [

{

"Oid": 11,

"Name": "Logo Centre (Zone A)",

"Address": "Private Warehouse, Ugba, Logo LGA"

},

{

"Oid": 12,

"Name": "Makurdi Centre (Zone B)",

"Address": "Ministry of Agric, Makurdi "

},

{

"Oid": 13,

"Name": "Oturkpo Centre (Zone C)",

"Address": "Private Warehouse, Oturkpo"

},

{

"Oid": 15,

"Name": "Borno MAAN centre",

"Address": "Bolori Store, Flavour Mill, Behind Vita Foam, Maiduguri"

},

{

"Oid": 18,

"Name": "Bauchi Centre",

"Address": "BASPD, Dass Road, Bauchi"

}

],

"NoOfDistributionCentres": 5

},

{

"Oid": 2,

"Name":

"MAIZE GROWERS, PROCESSORS AND MARKETERS ASSOCIATION OF NIGERIA",

"Acronym": "MAGPAMAN",

"DistributionCentres": [

{

"Oid": 2,

"Name": "Guma Centre",

"Address":

"P 32, 2nd Avenue Federal Housing Estate, N/Bank, Makurdi"

},

{

"Oid": 3,

"Name": "Logo Centre",

"Address": "Terhemen Akema Storage Facility, Ugba, Logo LGA"

},

{

"Oid": 5,

"Name": "Oturkpo Centre",

"Address": "Grain Store, Lower Benue Okele Project, Otukpo"

},

{

"Oid": 6,

"Name": "Gboko Centre",

"Address":

"K3 New Road, Opposite former coca cola plant. Solar Schools Street,

Gboko"

},

{

"Oid": 7,

"Name": "Gwer East Centre",

"Address":

"Ahua Shardye's Warehouse, Behind Sylkan Filling Station, Ikpayongo ,

G/East LGA"

},

{

"Oid": 8,

"Name": "Kwande Centre",

"Address": "KM 3, Adagi Road, Adikpo"

},

{

"Oid": 9,

"Name": "Ohimini Centre",

"Address": "Ajoga Oglewu, Ohimini"

},

{

"Oid": 10,

"Name": "Oju Centre",

"Address": "Behind Town Hall, Ohuhu owo, Oju LGA"

}

],

"NoOfDistributionCentres": 8

}

],

};

final _anchors = <Anchor>[];

@override

Widget build(BuildContext context) {

// now you can use the anchors list here

return Scaffold(

body: ListView.builder(

itemCount: _anchors.length,

itemBuilder: (context, index) {

final anchor = _anchors[index];

return ListTile(

title: Text(anchor.name),

subtitle: Text(anchor.acronym),

trailing: Text(anchor.distributionCenters?.length?.toString()),

onTap: () {

Navigator.push(

context,

MaterialPageRoute(

builder: (context) => AnchorPage(anchor: anchor),

),

);

},

);

},

),

);

}

@override

void initState() {

super.initState();

final anchors = _parseAnchors(anchorsMap);

_anchors.addAll(anchors);

}

}

以上是 如何遍历属于键值的对象数组-Flutter 的全部内容, 来源链接: utcz.com/qa/426438.html

回到顶部