Flutter亚马逊图片加载插件amazon_image的使用
Flutter亚马逊图片加载插件amazon_image
的使用
亚马逊图片插件 amazon_image
Widget 用于从亚马逊加载图片。
开始使用
在创建应用程序时,我们经常需要使用图片。这些图片可以从哪里获取呢?有很多优秀的网站允许我们免费使用照片和图片。但对于受版权保护的材料怎么办?有一个处理这些图片的好网站,那就是亚马逊。
这个包让我们可以轻松地从亚马逊的站点使用图片。这样做可以吗?当然可以,因为这是一张带有联盟广告的图片。看,如果我们双击它,它会打开亚马逊的站点。如果用户直接购买了产品,这将支付开发此插件的成本。或者,如果你有自己的联盟ID,也可以设置它。
注意事项
不幸的是,并不是所有的图片都可以使用。我可以使用书籍和主要玩具的图片,但不能使用小型玩具或DVD的图片。请确保你想使用的图片会被显示出来。
使用方法
首先,检查 ASIN(亚马逊标准标识号)。
如果你在 pubspec.yaml
中设置了 ASIN 并执行以下操作,它将会被显示。
Widget build(BuildContext context) {
return AmazonImage('B003O2SHKG');
}
我们可以选择三种不同的图片尺寸,默认为中等尺寸。
AmazonImage(
asin,
imageSize: ImageSize.Large,
),
点击、双击或长按的行为可以启用。如果我们不想设置该行为,可以做其他事情。
AmazonImage(
asin,
isLaunchAfterTap: true,
isLaunchAfterDoubleTap: false,
isLaunchAfterLongTap: true,
),
在跳转到亚马逊站点之前或之后,我们可以执行特定的处理。
AmazonImage(
asin,
context: context,
functionBeforeLaunch: (BuildContext context) async {
var result = await askUser();
return Future.value(result);
},
),
我们可以选择自己的亚马逊联盟追踪ID。
AmazonImageSetting().setTrackingId(trackingId);
我们可以从环境变量中获取国家。如果它是以下国家之一,我们将获取该国家的图片和链接。如果不是,将获取美国的图片和链接。
完整示例代码
以下是完整的示例代码:
import 'dart:async';
import 'package:amazon_image/amazon_image.dart';
import 'package:amazon_image/amazon_image_holder.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
const asin = 'B003O2SHKG';
const flutters = ['B003HGGHTW', 'B003JBHP4G', 'B00408ANAK', 'B07FK68VVB'];
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(),
localizationsDelegates: [
GlobalWidgetsLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'),
const Locale('nn'),
],
home: Home(),
);
}
}
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
[@override](/user/override)
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int countTap = 0;
int countLongTap = 0;
String _asin = asin;
late TextEditingController controller;
AmazonImage _amazonImage = AmazonImage(asin);
Completer<void> _prechaceCompleter = Completer();
late AmazonImageHolder holder;
[@override](/user/override)
void initState() {
super.initState();
controller = new TextEditingController(text: _asin);
}
[@override](/user/override)
void didChangeDependencies() {
super.didChangeDependencies();
holder = AmazonImageHolder(context);
holder.load(flutters).whenComplete(() {
_prechaceCompleter.complete();
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('amazon_image 示例应用'),
),
body: SafeArea(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('双击:跳转,图片大小:中等(默认)'),
),
AmazonImage(
asin,
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('双击:不跳转,单击和长按:跳转'),
),
AmazonImage(
asin,
isLaunchAfterTap: true,
isLaunchAfterDoubleTap: false,
isLaunchAfterLongTap: true,
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('点击事件'),
),
AmazonImage(
asin,
onTap: () {
setState(() {
countTap++;
});
},
onLongTap: () {
setState(() {
countLongTap++;
});
},
),
Text('点击:$countTap,长按:$countLongTap'),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('跳转前的事件'),
),
AmazonImage(
asin,
context: context,
functionBeforeLaunch: (BuildContext context) async {
var result = await askUser();
return Future.value(result);
},
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('跳转后的事件'),
),
AmazonImage(
asin,
functionAfterLaunch: () {
print('执行 functionAfterLaunch');
},
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('图片大小:小'),
),
AmazonImage(
asin,
imageSize: ImageSize.Small,
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('图片大小:中等(默认)'),
),
AmazonImage(
asin,
imageSize: ImageSize.Middle,
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('图片大小:大'),
),
AmazonImage(
asin,
imageSize: ImageSize.Large,
),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('预加载图片'),
),
FutureBuilder<void>(
future: _prechaceCompleter.future,
builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
print('状态 ${snapshot.connectionState}');
if (snapshot.connectionState == ConnectionState.done) {
return Row(
children: [
for (var flutter in flutters)
AmazonImage(
flutter,
holder: holder,
),
],
);
}
return CircularProgressIndicator();
}),
Padding(
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Text('加载图片'),
),
Row(
children: [
Text(
'输入 ASIN:',
),
Expanded(
child: TextField(
enabled: true,
maxLength: asin.length,
style: TextStyle(color: Colors.black),
obscureText: false,
maxLines: 1,
controller: controller,
onChanged: (value) => setState(() {
_asin = value;
}),
),
),
OutlinedButton(
onPressed: () {
setState(() {
_amazonImage = AmazonImage(_asin);
});
},
child: const Text('显示亚马逊图片'),
),
],
),
_amazonImage
],
),
),
),
);
}
Future<bool> askUser() async {
return await showDialog(
context: context,
builder: (context) {
return SimpleDialog(
title: const Text('你想要跳转到网址吗?'),
children: [
SimpleDialogOption(
child: const Text('是!'),
onPressed: () {
Navigator.pop(context, true);
},
),
SimpleDialogOption(
child: const Text('否'),
onPressed: () {
Navigator.pop(context, false);
},
),
],
);
},
);
}
}
更多关于Flutter亚马逊图片加载插件amazon_image的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter亚马逊图片加载插件amazon_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用amazon_image
插件来加载图片的示例代码。这个插件允许你从Amazon S3或Amazon CloudFront等亚马逊服务中加载图片,并提供了缓存和其他优化功能。
首先,你需要在你的pubspec.yaml
文件中添加amazon_image
依赖:
dependencies:
flutter:
sdk: flutter
amazon_image: ^latest_version # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter应用中,你可以使用AmazonImage
小部件来加载图片。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:amazon_image/amazon_image.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Amazon Image Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AmazonImageScreen(),
);
}
}
class AmazonImageScreen extends StatelessWidget {
// Amazon S3或Amazon CloudFront的图片URL
final String imageUrl = 'https://your-amazon-s3-or-cloudfront-url/your-image.jpg';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Amazon Image Example'),
),
body: Center(
child: AmazonImage(
imageUrl: imageUrl,
placeholder: AssetImage('assets/placeholder.jpg'), // 占位图,可以是网络图片或本地图片
errorWidget: Icon(Icons.error), // 加载失败时显示的组件
loadingBuilder: (context, child, loadingProgress) {
// 自定义加载中的组件,loadingProgress是一个0到1之间的值,表示加载进度
return Opacity(
opacity: loadingProgress,
child: child,
);
},
cacheOptions: CacheOptions(
maxAge: const Duration(days: 7), // 缓存图片的最长期限
),
),
),
);
}
}
在这个示例中:
imageUrl
是你要加载的图片的URL,它应该是一个有效的Amazon S3或Amazon CloudFront URL。placeholder
是一个占位图,当图片正在加载时显示。这里使用的是一个本地图片资源,你也可以使用网络图片。errorWidget
是当图片加载失败时显示的组件。loadingBuilder
是一个自定义加载中的组件的构建器。这里使用了一个Opacity
小部件,根据加载进度逐渐显示图片。cacheOptions
允许你设置缓存选项,比如缓存图片的最长期限。
请确保你的占位图资源(如assets/placeholder.jpg
)已经在你的pubspec.yaml
文件中声明,并且已经放置在项目的assets
文件夹中。
这个示例展示了如何使用amazon_image
插件来加载和缓存图片,同时提供了加载中和加载失败时的自定义处理。希望这对你有帮助!