Flutter Instagram风格故事展示插件flutter_instagram_stories的使用

Flutter Instagram风格故事展示插件 flutter_instagram_stories 的使用

flutter_instagram_stories 是一个用于在Flutter应用中展示类似Instagram和WhatsApp风格故事的插件。它支持图片、GIF、视频展示,并且具有多语言支持、缓存等功能。

插件特点

  • 简单集成:只需一行代码即可将插件集成到你的应用中。
  • 多媒体支持:支持显示图片、GIF、视频。
  • 自定义图标标题:可调整图标上的标题。
  • 预加载缓存:启动应用后自动缓存内容。
  • 多语言支持:支持多种语言。
  • 回调功能:用户关闭故事时触发回调,可用于实现订阅等功能。

安装

首先,在你的项目中添加依赖:

dependencies:
  flutter_instagram_stories: ^latest_version

然后在Dart文件中导入:

import 'package:flutter_instagram_stories/flutter_instagram_stories.dart';

iOS 注意事项

对于iOS平台,需要在Info.plist文件中添加以下配置以支持视频播放:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

使用示例

以下是一个完整的示例代码,展示了如何在Flutter应用中使用flutter_instagram_stories插件。

示例代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_instagram_stories/flutter_instagram_stories.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  static String collectionDbName = 'instagram_stories_db';
  CollectionReference dbInstance = FirebaseFirestore.instance.collection(collectionDbName);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter Instagram Stories"),
      ),
      body: Container(
        color: Colors.indigo,
        child: Column(
          children: [
            FlutterInstagramStories(
              collectionDbName: collectionDbName,
              showTitleOnIcon: true,
              backFromStories: () {
                _backFromStoriesAlert();
              },
              iconTextStyle: TextStyle(fontSize: 14.0, color: Colors.white),
              iconImageBorderRadius: BorderRadius.circular(15.0),
              iconBoxDecoration: BoxDecoration(
                borderRadius: BorderRadius.all(Radius.circular(15.0)),
                color: Color(0xFFffffff),
                boxShadow: [
                  BoxShadow(
                    color: Color(0xff333333),
                    blurRadius: 10.0,
                    offset: Offset(0.0, 4.0),
                  ),
                ],
              ),
              iconWidth: 150.0,
              iconHeight: 150.0,
              textInIconPadding: EdgeInsets.only(left: 8.0, right: 8.0, bottom: 12.0),
              imageStoryDuration: 7,
              progressPosition: ProgressPosition.top,
              repeat: true,
              inline: false,
              languageCode: 'en',
              backgroundColorBetweenStories: Colors.black,
              closeButtonIcon: Icon(Icons.close, color: Colors.white, size: 28.0),
              closeButtonBackgroundColor: Color(0x11000000),
              sortingOrderDesc: true,
              lastIconHighlight: true,
              lastIconHighlightColor: Colors.deepOrange,
              lastIconHighlightRadius: Radius.circular(15.0),
              captionTextStyle: TextStyle(fontSize: 22, color: Colors.white),
              captionMargin: EdgeInsets.only(bottom: 50),
              captionPadding: EdgeInsets.symmetric(horizontal: 24, vertical: 8),
            ),
            Center(
              child: Padding(
                padding: EdgeInsets.all(20.0),
                child: Text(
                  "App's functionality",
                  style: TextStyle(fontSize: 26, fontWeight: FontWeight.w600),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _backFromStoriesAlert() {
    showDialog(
      context: context,
      builder: (_) => SimpleDialog(
        title: Text(
          "User have looked stories and closed them.",
          style: TextStyle(fontWeight: FontWeight.normal, fontSize: 18.0),
        ),
        children: [
          SimpleDialogOption(
            child: Text("Dismiss"),
            onPressed: () {
              Navigator.pop(context);
            },
          ),
        ],
      ),
    );
  }
}

Firestore 数据库结构

该插件依赖于Firestore数据库来存储故事数据。你需要创建一个集合,并在其中添加文档,文档结构如下:

{
  "stories": [
    {
      "type": "image", // 或者 "video" 或 "gif"
      "url": "https://example.com/image.jpg",
      "caption": "This is a caption for the story."
    },
    {
      "type": "video",
      "url": "https://example.com/video.mp4",
      "caption": "This is a video story."
    }
  ],
  "username": "John Doe",
  "profilePicUrl": "https://example.com/profile.jpg"
}

确保字段类型正确,否则可能会导致空指针异常。

结论

通过上述步骤,你可以在Flutter应用中轻松集成Instagram风格的故事展示功能。如果你遇到任何问题或需要更多功能,请参考插件GitHub页面并提交issue。


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

1 回复

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


当然,以下是一个关于如何使用 flutter_instagram_stories 插件来创建 Instagram 风格故事展示的示例代码。这个插件允许你在 Flutter 应用中实现类似 Instagram 的故事展示功能。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_instagram_stories 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_instagram_stories: ^x.y.z  # 请将 x.y.z 替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 项目中实现故事展示功能。以下是一个简单的示例代码:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Instagram Stories Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: StoriesScreen(),
    );
  }
}

class StoriesScreen extends StatefulWidget {
  @override
  _StoriesScreenState createState() => _StoriesScreenState();
}

class _StoriesScreenState extends State<StoriesScreen> {
  List<String> storyImages = [
    'assets/story1.jpg',
    'assets/story2.jpg',
    'assets/story3.jpg',
    // 添加更多图片路径
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: InstagramStories(
          stories: storyImages.map((image) {
            return StoryItem(
              image: AssetImage(image),
              // 可选:添加其他配置,如用户信息、时间戳等
              // userInfo: UserInfo(
              //   name: "用户名",
              //   profilePicture: AssetImage('assets/profile.jpg'),
              // ),
              // timeStamp: DateTime.now(),
            );
          }).toList(),
          // 配置其他参数,如背景颜色、进度指示器等
          backgroundColor: Colors.black,
          isProgressIndicator: true,
          // 添加点击事件监听
          onStoryCompleted: (index) {
            print("Story $index completed");
          },
          // 添加滑动事件监听
          onStorySwiped: (index) {
            print("Story $index swiped");
          },
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 引入依赖:在 pubspec.yaml 中添加了 flutter_instagram_stories 依赖。
  2. 创建主应用:在 MyApp 类中定义了应用的入口。
  3. 创建故事屏幕:在 StoriesScreen 类中,我们定义了一个包含故事图片列表的 List<String>
  4. 构建故事展示:在 _StoriesScreenState 类中,使用 InstagramStories 小部件来展示故事。我们将图片列表映射为 StoryItem 对象列表,并将这些对象传递给 InstagramStories
  5. 添加事件监听:我们添加了 onStoryCompletedonStorySwiped 事件监听器,以便在故事完成或滑动时执行某些操作。

请注意,你需要将 assets/story1.jpg, assets/story2.jpg, assets/story3.jpg 等替换为你实际的故事图片路径,并在 pubspec.yaml 中声明这些图片资源。

这是一个基本的示例,flutter_instagram_stories 插件还提供了许多其他配置选项和功能,你可以根据需要进行扩展和自定义。

回到顶部