Flutter GridTile 可以通过点击触发吗?
Flutter GridTile can be triggered with tap?
我创建了一个 flutter 应用程序,并使用图像选择器将图像作为 gridView 获取到中心,并使用网格循环图像数组 tiles.Is 是否可以在点击时触发 gridTile?
下面是来自 main.dart 的代码,用于将图像添加到数组和网格视图中。
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
File _imageFile;
List<File> _imageList=[];
getImage() async {
var _fileName = await ImagePicker.pickImage();
setState(() {
_imageFile = _fileName;
_imageList.add(_imageFile);
});
}
removeImage(int index){
setState((){
_imageList.removeAt(index);
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child:_imageList.length == 0
? new Text('No image selected.')
:new GridView.count(
crossAxisCount: 4,
childAspectRatio: 1.0,
padding: const EdgeInsets.all(4.0),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
children: _imageList.map((File file) {
return new GridTile(
child: new Image.file(file, fit: BoxFit.cover,));
}).toList()),
),
floatingActionButton: new FloatingActionButton(
onPressed:getImage,
tooltip: 'Pick Image',
child: new Icon(Icons.add_a_photo),
),
);
}
}
您可以将 GridTile
包装在 InkResponse
或 GestureDetector
中并传递一个函数以在单击时调用
示例:
// Function to be called on click
void _onTileClicked(int index){
debugPrint("You tapped on item $index");
}
// Get grid tiles
List<Widget> _getTiles(List<File> iconList) {
final List<Widget> tiles = <Widget>[];
for (int i = 0; i < iconList.length; i++) {
tiles.add(new GridTile(
child: new InkResponse(
enableFeedback: true,
child: new Image.file(iconList[i], fit: BoxFit.cover,),
onTap: () => _onTileClicked(i),
)));
}
return tiles;
}
// GridView
new GridView.count(
crossAxisCount: 4,
childAspectRatio: 1.0,
padding: const EdgeInsets.all(4.0),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
children: _getTiles(_imageList),
)
希望对您有所帮助!
您还可以使用网格生成器
child: new GridView.builder(
itemCount: 20,
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2),
itemBuilder: (BuildContext context, int index) {
return new Card(
child: new InkResponse(
child: Image.asset('assets/whats-best-for-your-app-objective-cswift.jpg'),
onTap: (){
print(index);
},
),
);
}),
我创建了一个 flutter 应用程序,并使用图像选择器将图像作为 gridView 获取到中心,并使用网格循环图像数组 tiles.Is 是否可以在点击时触发 gridTile? 下面是来自 main.dart 的代码,用于将图像添加到数组和网格视图中。
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
File _imageFile;
List<File> _imageList=[];
getImage() async {
var _fileName = await ImagePicker.pickImage();
setState(() {
_imageFile = _fileName;
_imageList.add(_imageFile);
});
}
removeImage(int index){
setState((){
_imageList.removeAt(index);
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child:_imageList.length == 0
? new Text('No image selected.')
:new GridView.count(
crossAxisCount: 4,
childAspectRatio: 1.0,
padding: const EdgeInsets.all(4.0),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
children: _imageList.map((File file) {
return new GridTile(
child: new Image.file(file, fit: BoxFit.cover,));
}).toList()),
),
floatingActionButton: new FloatingActionButton(
onPressed:getImage,
tooltip: 'Pick Image',
child: new Icon(Icons.add_a_photo),
),
);
}
}
您可以将 GridTile
包装在 InkResponse
或 GestureDetector
中并传递一个函数以在单击时调用
示例:
// Function to be called on click
void _onTileClicked(int index){
debugPrint("You tapped on item $index");
}
// Get grid tiles
List<Widget> _getTiles(List<File> iconList) {
final List<Widget> tiles = <Widget>[];
for (int i = 0; i < iconList.length; i++) {
tiles.add(new GridTile(
child: new InkResponse(
enableFeedback: true,
child: new Image.file(iconList[i], fit: BoxFit.cover,),
onTap: () => _onTileClicked(i),
)));
}
return tiles;
}
// GridView
new GridView.count(
crossAxisCount: 4,
childAspectRatio: 1.0,
padding: const EdgeInsets.all(4.0),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
children: _getTiles(_imageList),
)
希望对您有所帮助!
您还可以使用网格生成器
child: new GridView.builder(
itemCount: 20,
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2),
itemBuilder: (BuildContext context, int index) {
return new Card(
child: new InkResponse(
child: Image.asset('assets/whats-best-for-your-app-objective-cswift.jpg'),
onTap: (){
print(index);
},
),
);
}),