一、Flutter圖片按鈕
在Flutter中,圖片按鈕是一種非常常見的視覺組件。通過使用InkWell或GestureDetector包裹圖片,就可以實現點擊事件。同時,我們可以通過設置不同的屬性來自定義按鈕的樣式。
GestureDetector(
onTap: () {
// 點擊事件
},
child: Image.asset(
'assets/images/button.png',
width: 120,
height: 60,
fit: BoxFit.cover,
alignment: Alignment.center,
),
)
二、Flutter圖片加載失敗顯示默認圖片
在網絡請求或本地圖片加載時,如果圖片不存在或加載失敗,我們可以設置一張默認圖片來代替。
Image.network(
'http://www.example.com/404.jpg',
width: 200,
height: 200,
fit: BoxFit.cover,
alignment: Alignment.center,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset('assets/images/default.png');
},
)
三、Flutter圖片加載失敗
在網絡請求的圖片加載時,如果網絡不穩定或服務器宕機等異常情況,圖片可能會加載失敗。我們可以通過設置errorBuilder屬性來自定義加載失敗時的樣式。
Image.network(
'http://www.example.com/image.jpg',
width: 200,
height: 200,
fit: BoxFit.cover,
alignment: Alignment.center,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.broken_image,
size: 60,
color: Colors.grey[400],
),
SizedBox(height: 10),
Text(
'圖片加載失敗',
style: TextStyle(
color: Colors.grey[400],
fontSize: 16,
),
),
],
);
},
)
四、Flutter圖片無法鋪滿
在設置圖片長寬時,如果圖片的長寬比與容器不一致,那麼圖片可能無法完全鋪滿容器。我們可以通過調整fit屬性來解決這個問題。
Image.network( 'http://www.example.com/image.jpg', width: double.infinity, // 設置寬度為容器寬度 height: 200, fit: BoxFit.fill, // 填充整個容器 alignment: Alignment.center, )
五、Flutter圖片拉伸比例
拉伸比例指在填充容器時,圖片長寬比是否改變。fit屬性中的scaleDown和none值表示不改變比例,而cover和fill值則表示改變比例。
Image.network( 'http://www.example.com/image.jpg', width: 200, height: 200, fit: BoxFit.cover, alignment: Alignment.center, )
六、Flutter圖片變圓角
我們可以通過使用ClipRRect組件將圖片切成圓角。
ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Image.network(
'http://www.example.com/image.jpg',
width: 200,
height: 200,
fit: BoxFit.cover,
alignment: Alignment.center,
),
)
七、Flutter圖片列表
在開發中,我們經常需要展示多張圖片,這時我們可以使用ListView或GridView等滾動組件來實現圖片列表。
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1,
),
itemBuilder: (BuildContext context, int index) {
return Image.network(
'http://www.example.com/image_$index.jpg',
fit: BoxFit.cover,
alignment: Alignment.center,
);
},
)
八、Flutter圖片上傳控件
在Flutter中實現圖片上傳控件比較簡單。我們可以使用Flutter自帶的ImagePicker組件來控制相冊或相機。
File? _imageFile;
Future _getImageFromGallery() async {
final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
setState(() {
_imageFile = File(pickedFile!.path);
});
}
Future _getImageFromCamera() async {
final pickedFile = await ImagePicker().getImage(source: ImageSource.camera);
setState(() {
_imageFile = File(pickedFile!.path);
});
}
Column(
children: [
ElevatedButton(
onPressed: _getImageFromGallery,
child: Text('從相冊選擇'),
),
ElevatedButton(
onPressed: _getImageFromCamera,
child: Text('拍照上傳'),
),
if (_imageFile != null) Image.file(_imageFile!),
],
)
九、Flutter圖片列表內存溢出
在展示大量圖片時,由於內存限制,可能會發生內存溢出的情況。我們可以使用Flutter自帶的CachedNetworkImage組件來避免內存溢出問題。
CachedNetworkImage( imageUrl: 'http://www.example.com/image.jpg', fit: BoxFit.cover, alignment: Alignment.center, placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), )
十、Flutter圖片視頻編輯選取
在視頻編輯時,我們可以使用Flutter自帶的video_player和flutter_ffmpeg組件來選擇視頻並提取封面。
Future _pickVideoAndThumbnail() async {
final pickedFile = await ImagePicker().getVideo(source: ImageSource.gallery);
if (pickedFile != null) {
final thumbnailPath = await _extractThumbnail(pickedFile.path);
setState(() {
_videoFile = File(pickedFile.path);
_thumbnailFile = File(thumbnailPath);
});
}
}
Future _extractThumbnail(String videoPath) async {
final thumbnailPath = '${(await getTemporaryDirectory()).path}/thumbnail.jpg';
await FlutterFFmpeg().execute(
'-i $videoPath -ss 00:00:01.000 -vframes 1 $thumbnailPath',
);
return thumbnailPath;
}
Column(
children: [
ElevatedButton(
onPressed: _pickVideoAndThumbnail,
child: Text('選擇視頻'),
),
if (_thumbnailFile != null) Image.file(_thumbnailFile!),
if (_videoFile != null) Text(_videoFile!.path),
],
)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/184585.html
微信掃一掃
支付寶掃一掃