Flutter应用内故事展示插件inappstory_plugin的使用

Flutter应用内故事展示插件inappstory_plugin的使用

安装

当前该插件还在开发中,并未发布。

在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  ...
  inappstory_plugin: ^0.0.6
  ...

Android需求

确保更新你的 Android SDK 版本:

minSdkVersion = 23
compileSdkVersion = 34
targetSdkVersion = 34

初始化

使用你的 API 密钥初始化插件:

InappstoryPlugin().initWith('<your api key>', '<user id>', false);

使用

要使用该库,创建一个 YourStoryWidget 并实现 StoryWidget 接口:

class YourStoryWidget extends StatelessWidget implements StoryWidget {
  const YourStoryWidget(this.story, {super.key});
  ...
}

获取特定 feed 的故事组件:

InAppStoryPlugin().getStoriesWidgets(
  feed: '<your feed>',
  storyBuilder: <function returns Widget for Story>,
);

获取特定 feed 的故事组件并包含收藏项:

InAppStoryPlugin().getStoriesWidgets(
  feed: '<your feed>',
  storyBuilder: <function returns Widget for Story>,
  favoritesBuilder: <function returns Widget for in feed Favorites>,
);

完整示例

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final initialization = InappstoryPlugin().initWith('<your api key>', '<user id>', false);

  final flutterFeedStoriesWidgetsStream = InAppStoryPlugin().getStoriesWidgets(
    feed: 'flutter',
    storyBuilder: StoryWidgetSimpleDecorator.new,
    favoritesBuilder: GridFeedFavoritesWidget.new, // 可以为null
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          SizedBox(
            height: 150,
            child: StreamBuilder(
              stream: flutterFeedStoriesWidgetsStream,
              builder: (_, snapshot) {
                if (snapshot.hasError) return Text('${snapshot.error}');

                if (snapshot.hasData) {
                  return ListView.separated(
                    scrollDirection: Axis.horizontal,
                    itemBuilder: (_, index) => snapshot.requireData.elementAt(index),
                    separatorBuilder: (_, __) => const SizedBox(width: 12),
                    itemCount: snapshot.requireData.length,
                  );
                }

                return const LinearProgressIndicator();
              },
            ),
          ),
        ],
      ),
    );
  }
}

class StoryWidgetSimpleDecorator extends StatelessWidget implements StoryWidget {
  const StoryWidgetSimpleDecorator(this.story, {super.key});

  [@override](/user/override)
  final Story story;

  Image? get imageNullable {
    final imageFile = story.imageFile;

    if (imageFile == null) return null;

    return Image.file(imageFile);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: story.updates,
      builder: (_, __) {
        return ClipRRect(
          borderRadius: const BorderRadius.all(Radius.circular(10)),
          child: AspectRatio(
            aspectRatio: story.aspectRatio,
            child: GestureDetector(
              onTap: story.tap,
              child: Stack(
                children: [
                  Positioned.fill(
                    child: imageNullable ?? ColoredBox(color: story.backgroundColor),
                  ),
                  const Positioned.fill(
                    child: DecoratedBox(
                      decoration: BoxDecoration(
                        gradient: LinearGradient(
                          begin: Alignment.topCenter,
                          end: Alignment.bottomCenter,
                          colors: [
                            Colors.transparent,
                            Colors.black87,
                          ],
                        ),
                      ),
                    ),
                  ),
                  Align(
                    alignment: Alignment.bottomLeft,
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        story.title,
                        style: TextStyle(color: story.titleColor),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );
  }
}

获取收藏的故事

final favorites = InAppStoryPlugin().getFavoritesStoriesWidgets(
      feed: 'flutter',
      storyBuilder: StoryWidgetSimpleDecorator.new,
    ).asBroadcastStream();

外观管理器

故事阅读器外观

显示/隐藏按钮:

  • 点赞/不喜欢
  • 收藏
  • 分享
AppearanceManagerHostApi().setHasLike(true);
AppearanceManagerHostApi().setHasFavorites(true);
AppearanceManagerHostApi().setHasShare(true);

故事阅读器关闭按钮位置

位置选项:

  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
AppearanceManagerHostApi().setClosePosition(position)

故事阅读器计时器渐变

启用/禁用状态:

AppearanceManagerHostApi().setTimerGradientEnable(true)

获取状态:

final Future<bool> timerGradientEnabledFuture= AppearanceManagerHostApi().getTimerGradientEnable();

设置渐变颜色和位置:

const gradient = LinearGradient(colors: [Colors.purple, Colors.amber], stops: [0.1, 0.3]);

AppearanceManagerHostApi().setTimerGradient(
                        colors: gradient.colors.map((it) => it.value).toList(),
                        locations: gradient.stops ?? [],
                      );

故事阅读器背景

AppearanceManagerHostApi().setReaderBackgroundColor(Colors.green.value)

故事阅读器圆角半径

AppearanceManagerHostApi().setReaderCornerRadius(16); // int

单个故事API

通过 ID 显示单个故事:

IASSingleStoryHostApi().show(storyId: story.id, slide: 1);

如果用户还没有看过,则显示单个故事:

IASSingleStoryHostApi().showOnce(storyId: story.id);

监听回调结果:

class _WidgetState extends State<...> implements IShowStoryOnceCallbackFlutterApi {
  [@override](/user/override)
  void initState() {
    super.initState();
    IShowStoryOnceCallbackFlutterApi.setUp(this);
  }

  [@override](/user/override)
  void dispose() {
    IShowStoryOnceCallbackFlutterApi.setUp(null);
    super.dispose();
  }
  
  [@override](/user/override)
  void alreadyShown() => print('IShowStoryOnceCallback.alreadyShown()');

  [@override](/user/override)
  void onError() => print('IShowStoryOnceCallback.onError()');

  [@override](/user/override)
  void onShow() => print('IShowStoryOnceCallback.onShow()');
}

呼吁行动

添加/移除呼吁行动监听器:

  1. 实现 CallToActionCallbackFlutterApi 接口。
  2. 设置此监听器:
class _SimpleFeedExampleState extends State<SimpleFeedExampleWidget> implements CallToActionCallbackFlutterApi {
  [@override](/user/override)
  void initState() {
    super.initState();
    CallToActionCallbackFlutterApi.setUp(this); // 添加监听器
  }

  [@override](/user/override)
  void dispose() {
    CallToActionCallbackFlutterApi.setUp(null); // 移除监听器
    super.dispose();
  }

  final callsToAction = <String>[];

  [@override](/user/override)
  void callToAction(SlideDataDto? slideData, String? url, ClickActionDto? clickAction) {
    // 执行相关操作
  }
}

更多关于Flutter应用内故事展示插件inappstory_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用内故事展示插件inappstory_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中集成和使用inappstory_plugin插件的代码示例。这个插件假设是用于在应用内展示故事或广告内容的自定义插件。请注意,实际插件的API和配置可能有所不同,因此以下代码是基于一个假设的插件接口编写的。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加inappstory_plugin依赖项(假设该插件已经在pub.dev上发布):

dependencies:
  flutter:
    sdk: flutter
  inappstory_plugin: ^x.y.z  # 使用实际的版本号替换x.y.z

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:inappstory_plugin/inappstory_plugin.dart';

3. 初始化插件

在你的应用的主入口文件(通常是main.dart)中初始化插件:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  InAppStoryPlugin.instance.initialize();  // 假设插件有一个初始化方法
  runApp(MyApp());
}

4. 展示故事

在你的应用中,当需要展示故事时,可以调用插件提供的方法。以下是一个简单的示例,展示如何在按钮点击时显示故事:

import 'package:flutter/material.dart';
import 'package:inappstory_plugin/inappstory_plugin.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  InAppStoryPlugin.instance.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('In-App Story Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _showStory();
            },
            child: Text('Show Story'),
          ),
        ),
      ),
    );
  }

  void _showStory() async {
    try {
      // 假设插件有一个showStory方法,接受一个配置对象
      var storyConfig = StoryConfig(
        storyId: '12345',  // 故事的唯一标识符
        placement: 'home_screen',  // 故事的展示位置
      );
      
      await InAppStoryPlugin.instance.showStory(storyConfig);
    } catch (e) {
      // 处理错误
      print('Failed to show story: $e');
    }
  }
}

// 假设的配置类
class StoryConfig {
  final String storyId;
  final String placement;

  StoryConfig({required this.storyId, required this.placement});
}

5. 处理回调(可选)

支持void回调 _(setup例如Story,Callbacks当用户()完成 {故事
时  ),In你可以App通过Story注册Plugin回调.来处理instance这些.事件on:StoryCompleted = (storyId) {
    // 处理故事完成事件
    print('Story $storyId completed');
  };

  InAppStoryPlugin.instance.onStoryClicked = (storyId) {
    // 处理故事点击事件
    print('Story $storyId clicked');
  };

  // 其他可能的回调...
}

你可以在main函数或你的应用的初始化部分调用_setupStoryCallbacks()来设置这些回调。

注意

  • 上述代码是一个假设的示例,实际的inappstory_plugin插件可能有不同的API和配置要求。
  • 请查阅插件的官方文档以获取最新的API信息和配置选项。
  • 确保插件已正确安装并导入到你的Flutter项目中。

希望这能帮助你在Flutter应用中集成和使用inappstory_plugin插件!

回到顶部