我想知道如何在我的 gridview 中收听 json 对象,以便我可以将它们用于导航逻辑。例如选择 gridview 项目的类别 ID 并使用它在下一页中显示它的相应数据或项目。
问问题
484 次
2 回答
1
最终输出:
完整的工作代码:
import 'package:flutter/material.dart';
/* This is the data that we are going to use to render the grid of products using Gridview.
As pointed out by Pranay, you can use the fetched data from a remote server.
but for the sake of simplicity, I am using hardcoded data.
*/
List data = [
{
"id": 1,
"name": "Mix Pina Colada 1",
"desc": "Ice Cream Bar - Oreo Cone 1",
"image": "http://dummyimage.com/110x138.png/dddddd/000000",
"price": 93,
"quantity": 0,
},
{
"id": 2,
"name": "Cake - Bande Of Fruit",
"desc": "Cheese - Cheddar With Claret",
"image": "http://dummyimage.com/172x223.png/cc0000/ffffff",
"price": 4,
"quantity": 0,
},
{
"id": 3,
"name": "Lid Coffee Cup 8oz Blk",
"desc": "Rosemary - Primerba, Paste",
"image": "http://dummyimage.com/110x243.png/ff4444/ffffff",
"price": 18,
"quantity": 0,
},
];
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'GridView Example'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
List products = data;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.amber,
appBar: AppBar(
title: Text(title),
),
body: GridView.count(
primary: false,
padding: const EdgeInsets.all(20),
crossAxisSpacing: 10,
mainAxisSpacing: 10,
crossAxisCount: 2,
children: products.map((product) {
print(product["name"]);
return InkWell(
onTap: () {
/* Using Navigator we will navigate to DetailsScreen,
along with it we will also pass the product object which
will be used to render the product details of the clicked item
*/
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailsScreen(
product: product,
),
),
);
},
child: Container(
color: Colors.white,
padding: EdgeInsets.all(10),
child: Text(product["name"])),
);
}).toList(),
),
);
}
}
/*
The following widget tasked the product object that we passed in
Navigator, and displays the data of that particular product.
*/
class DetailsScreen extends StatelessWidget {
final dynamic product;
DetailsScreen({this.product});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(product["name"])),
body: Column(
children: [
Image.network(
product["image"],
width: double.infinity,
height: 200,
color: Colors.amberAccent,
),
Text("Name: " + product["name"]),
Text("Description: " + product["desc"]),
Text("Price: " + product["price"].toString()),
],
),
);
}
}
于 2020-12-11T14:53:15.127 回答
1
您可以从网络中获取要在 GridView 中显示的列表。
getTags() async {
var res = await Client().getAsync("yourURL");
var decodedJson = jsonDecode(res.body);
setState(() {
tagList = decodedJson;
});
}
现在您可以使用 GridView.builder 和 InkWell 导航到另一个屏幕。
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: MediaQuery.of(context).size.width /
((MediaQuery.of(context).size.height) / 2),
),
itemCount: tagList.length,
itemBuilder: (BuildContext context, int index) {
Tag tag = (tagList)[index];
return InkWell(
onTap:(){
Navigator.push(
context,
MaterialPageRoute(builder: (context) =>
YourPageClass(yourId: tag.id)),
);
},
child: Container()
)
},
),
这是 Tag 类的代码。
class Tag {
int id;
Tag({this.id,});
Tag.fromJson(Map<String, dynamic> json) {
id = json['id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
return data;
}
}
于 2020-12-11T14:12:21.043 回答