Flutter亚马逊图片加载插件amazon_image的使用

Flutter亚马逊图片加载插件amazon_image的使用

亚马逊图片插件 amazon_image

Widget 用于从亚马逊加载图片。

开始使用

在创建应用程序时,我们经常需要使用图片。这些图片可以从哪里获取呢?有很多优秀的网站允许我们免费使用照片和图片。但对于受版权保护的材料怎么办?有一个处理这些图片的好网站,那就是亚马逊。

这个包让我们可以轻松地从亚马逊的站点使用图片。这样做可以吗?当然可以,因为这是一张带有联盟广告的图片。看,如果我们双击它,它会打开亚马逊的站点。如果用户直接购买了产品,这将支付开发此插件的成本。或者,如果你有自己的联盟ID,也可以设置它。

示例动画

注意事项

不幸的是,并不是所有的图片都可以使用。我可以使用书籍和主要玩具的图片,但不能使用小型玩具或DVD的图片。请确保你想使用的图片会被显示出来。

使用方法

首先,检查 ASIN(亚马逊标准标识号)。

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

1 回复

更多关于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插件来加载和缓存图片,同时提供了加载中和加载失败时的自定义处理。希望这对你有帮助!

回到顶部