从数据文件中获取 url 以重定向到 gridview 构建器中的新指向页面
fetch url from data file to redirect to new pointed page in gridviewbuilder
Flutter 和编码的新手,所以新手警告:D,我正在尝试创建一个 gridview.builder,它将在点击时重定向到正确分配给该索引页面(已创建),但我没有不知道如何在 model.dart 中分配它,然后将它传递给 InkWell 中的 Navigator,非常感谢任何解释这是如何工作的
这是 gridview 页面
import 'package:flutter/material.dart';
import 'package:practice/data/model.dart';
import 'package:practice/builds/allbuilds.dart';
class GridViewPage extends StatefulWidget {
@override
_GridViewPage createState() => _GridViewPage();
}
class _GridViewPage extends State<GridViewPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.grey,
automaticallyImplyLeading: true,
title: const Text(
'Builds',
style: TextStyle(
fontFamily: 'Lexend Doca',
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
actions: const [],
centerTitle: false,
elevation: 2,
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(15, 0, 15, 25),
child: GridView.builder(
itemCount: griddata.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
return GridSingleItem(itemGriddata: griddata[index]);
},
),
),
),
],
));
}
}
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
const GridSingleItem({Key key, @required this.itemGriddata})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
Navigator.push(
context, MaterialPageRoute(builder: (context) => PageX()));
},
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: const Color(0x00EEEEEE),
image: DecorationImage(
fit: BoxFit.cover,
image: Image.asset(itemGriddata["image"]).image,
),
),
),
),
);
}
}
这是模特
const griddata = [
{
"name": "Page1",
"image" : "assets/images/Image1.png",
},
{
"name": "Page2",
"image" : "assets/images/Image2.png",
}
];
如果我没答错你的问题。
您想为特定数据创建模型,
然后在gridviewbuilder中使用数据,
然后在点击时将数据传递给下一个 screen/page。 [
{
“名称”:“第1页”,
“图片”:“assets/images/Image1.png”,
},
{
"name": "Page2",
"image" : "assets/images/Image2.png",
}
]
从数据中我们可以得到
class Data{
final String name;
final String image;
Data({this.name,this.image});
}
现在 const griddata 变成了;
const griddata = [
Data(name:'Page1',image:"assets/images/Image1.png",),
Data(name: "Page2","image : "assets/images/Image2.png")
];
到目前为止我们所做的是从原始网格数据创建模型,
Now passing the data to other pages;
我建议制作目标页面,即 PageX 以接受数据模型
像这样;
class PageX extends StatelessWidget{
final Data data; //<------
PageX(data);
@override
Widget build(){
....
}
}
然后在你的 onTap 属性 中,你可以有类似的东西;
Navigator.push(
context, MaterialPageRoute(builder: (context) => PageX(data)));
更新:
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
final Function onTap; //add a function as a parameter/property here
const GridSingleItem({Key key,
@required this.itemGriddata,
this.onTap,
this.image,
})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap:onTap,
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: const Color(0x00EEEEEE),
image: DecorationImage(
fit: BoxFit.cover,
image: Image.asset(itemGriddata["image"]).image,
),
),
),
),
);
}
}
完整代码:
import 'package:flutter/material.dart';
import 'package:practice/data/model.dart';
import 'package:practice/builds/allbuilds.dart';
class GridViewPage extends StatefulWidget {
@override
_GridViewPage createState() => _GridViewPage();
}
class _GridViewPage extends State<GridViewPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.grey,
automaticallyImplyLeading: true,
title: const Text(
'Builds',
style: TextStyle(
fontFamily: 'Lexend Doca',
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
actions: const [],
centerTitle: false,
elevation: 2,
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(15, 0, 15, 25),
child: GridView.builder(
itemCount: griddata.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
return GridSingleItem(itemGriddata:
griddata[index],
onTap:(){
Navigator.push(
context, MaterialPageRoute(builder: (context) =>
PageX(griddata[index])));
}
);
},
),
),
),
],
));
}
}
好吧,我自己想出来了,原来是字面上的 2 行代码
在模型中,将 const 交换为 final,添加 url 属性
final griddata = [
{
"name": "Page1",
"image" : "assets/images/Image1.png",
"url": Page1()
},
{
"name": "Page2",
"image" : "assets/images/Image2.png",
"url": Page2()
}
];
并在 GridSingleItem onTap 中传递 itemGriddata["url"]
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
const GridSingleItem({Key key, @required this.itemGriddata})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
Navigator.push(
context, MaterialPageRoute(builder: (context) => itemGriddata["url"]));
},
Flutter 和编码的新手,所以新手警告:D,我正在尝试创建一个 gridview.builder,它将在点击时重定向到正确分配给该索引页面(已创建),但我没有不知道如何在 model.dart 中分配它,然后将它传递给 InkWell 中的 Navigator,非常感谢任何解释这是如何工作的
这是 gridview 页面
import 'package:flutter/material.dart';
import 'package:practice/data/model.dart';
import 'package:practice/builds/allbuilds.dart';
class GridViewPage extends StatefulWidget {
@override
_GridViewPage createState() => _GridViewPage();
}
class _GridViewPage extends State<GridViewPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.grey,
automaticallyImplyLeading: true,
title: const Text(
'Builds',
style: TextStyle(
fontFamily: 'Lexend Doca',
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
actions: const [],
centerTitle: false,
elevation: 2,
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(15, 0, 15, 25),
child: GridView.builder(
itemCount: griddata.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
return GridSingleItem(itemGriddata: griddata[index]);
},
),
),
),
],
));
}
}
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
const GridSingleItem({Key key, @required this.itemGriddata})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
Navigator.push(
context, MaterialPageRoute(builder: (context) => PageX()));
},
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: const Color(0x00EEEEEE),
image: DecorationImage(
fit: BoxFit.cover,
image: Image.asset(itemGriddata["image"]).image,
),
),
),
),
);
}
}
这是模特
const griddata = [
{
"name": "Page1",
"image" : "assets/images/Image1.png",
},
{
"name": "Page2",
"image" : "assets/images/Image2.png",
}
];
如果我没答错你的问题。 您想为特定数据创建模型, 然后在gridviewbuilder中使用数据, 然后在点击时将数据传递给下一个 screen/page。 [ { “名称”:“第1页”, “图片”:“assets/images/Image1.png”, },
{
"name": "Page2",
"image" : "assets/images/Image2.png",
}
]
从数据中我们可以得到
class Data{
final String name;
final String image;
Data({this.name,this.image});
}
现在 const griddata 变成了;
const griddata = [
Data(name:'Page1',image:"assets/images/Image1.png",),
Data(name: "Page2","image : "assets/images/Image2.png")
];
到目前为止我们所做的是从原始网格数据创建模型,
Now passing the data to other pages;
我建议制作目标页面,即 PageX 以接受数据模型 像这样;
class PageX extends StatelessWidget{
final Data data; //<------
PageX(data);
@override
Widget build(){
....
}
}
然后在你的 onTap 属性 中,你可以有类似的东西;
Navigator.push(
context, MaterialPageRoute(builder: (context) => PageX(data)));
更新:
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
final Function onTap; //add a function as a parameter/property here
const GridSingleItem({Key key,
@required this.itemGriddata,
this.onTap,
this.image,
})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap:onTap,
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: const Color(0x00EEEEEE),
image: DecorationImage(
fit: BoxFit.cover,
image: Image.asset(itemGriddata["image"]).image,
),
),
),
),
);
}
}
完整代码:
import 'package:flutter/material.dart';
import 'package:practice/data/model.dart';
import 'package:practice/builds/allbuilds.dart';
class GridViewPage extends StatefulWidget {
@override
_GridViewPage createState() => _GridViewPage();
}
class _GridViewPage extends State<GridViewPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.grey,
automaticallyImplyLeading: true,
title: const Text(
'Builds',
style: TextStyle(
fontFamily: 'Lexend Doca',
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
actions: const [],
centerTitle: false,
elevation: 2,
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(15, 0, 15, 25),
child: GridView.builder(
itemCount: griddata.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (context, index) {
return GridSingleItem(itemGriddata:
griddata[index],
onTap:(){
Navigator.push(
context, MaterialPageRoute(builder: (context) =>
PageX(griddata[index])));
}
);
},
),
),
),
],
));
}
}
好吧,我自己想出来了,原来是字面上的 2 行代码
在模型中,将 const 交换为 final,添加 url 属性
final griddata = [
{
"name": "Page1",
"image" : "assets/images/Image1.png",
"url": Page1()
},
{
"name": "Page2",
"image" : "assets/images/Image2.png",
"url": Page2()
}
];
并在 GridSingleItem onTap 中传递 itemGriddata["url"]
class GridSingleItem extends StatelessWidget {
final dynamic itemGriddata;
const GridSingleItem({Key key, @required this.itemGriddata})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
Navigator.push(
context, MaterialPageRoute(builder: (context) => itemGriddata["url"]));
},