搜尋套件、儲存庫與 APP 分類

套件詳情v1.1.1

video_shop_flutter

一個用於建立類似 TikTok 和 YouTube Shorts 的購物影片元件的 Flutter 外掛。

AndroidiOSWebmacOS
近 30 天下載
95
喜歡數
27
Pub 分數
140

安裝套件

flutter pub add video_shop_flutter

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

video_shop_flutter 是一個 Flutter 插件,專為打造受 TikTok 和 YouTube Shorts 啟發的購物影片元件而設計。它讓開發者能夠整合互動式、可滑動的影片訊息流,並嵌入產品展示,讓使用者能直接在影片中瀏覽與購買商品。此套件支援跨 Android、iOS、Web 與 macOS 平台的無縫整合,提供類似原生的電商內容體驗。搭配可自訂的 UI 元件與順暢的影片播放功能,非常適合打造吸引人的社交電商體驗。

適用情境

  • 創建類似TikTok的購物影片
  • 構建類似 YouTube Shorts 的產品資訊流
  • 啟用影片內商品購買
  • 開發社交媒體電商應用
  • 將可購物影片內容整合到現有應用中

主要特色

  • 可滑動的影片串流
  • 嵌入式產品卡
  • 跨平台支援(Android、iOS、Web、macOS)
  • 互動購物元素
  • 流暢的影片播放整合

適合對象

  • 電子商務應用開發者
  • 社交媒體平台創作者
  • 數位行銷人員
  • 移動應用團隊
  • 內容驅動的零售應用

使用建議

  • 需要與後端產品數據整合
  • 可能需要自訂樣式以實現品牌一致
  • 依賴外部影片託管服務
  • 僅限基於影片的購物體驗
  • 高視頻密度可能帶來的效能影響

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

Flutter Shopping Video: Create video player layout like tiktok.

Features

Video player layout:

Getting started

First, add video_shop_flutter as a dependency in your pubspec.yaml file.

Example

import 'package:example/service/service.dart';
import 'package:example/widgets/like_widget.dart';
import 'package:flutter/material.dart';
import 'package:video_shop_flutter/page/page.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Map<String, dynamic>> data = [];
  ApiService service = ApiService();
  List<String> videoWatched = [];

  @override
  void initState() {
    super.initState();
  }

  @override
  void didChangeDependencies() async {
    List<Map<String, dynamic>> response = await service.mapData(1, 4);
    setState(() {
      data = response;
    });
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    debugPrint("\n data length: ${data.length} \n");

    return Scaffold(
      body: VideoShopFlutter(
        // Called every time video page is changed.
        updateLastSeenPage: (lastSeenPageIndex) {},
        // Video data.
        listData: data,
        // Watched videos, it's updated every time new video is watched.
        videoWatched: videoWatched,
        pageSize: 4,
        enableBackgroundContent: true,
        // Load more video data.
        loadMore: (page, pageSize) async {
          // Just for test.
          debugPrint("load more...");
          debugPrint("Video $videoWatched");
          List<Map<String, dynamic>> newData =
              await service.mapData((page + 2), 4);
          if (newData.isNotEmpty) {
            setState(() {
              data = [...data, ...newData];
            });
          }
          //.
        },
        // Your custom widget.
        likeWidget: (video, updateData) {
          return LikeWidget(
            likes: video?.likes ?? 0,
            liked: video?.liked ?? false,
            updateData: updateData,
            id: video?.id,
          );
        },
      ),
    );
  }
}

Note

  • listData in VideoShopFlutter(listData: playList,)

    The listData is a list of Map, each Map is a Video object and video object required some field of data like this:

     {
       'id': 123,
       'url': 'https://video.mp4'
       'thumbnail': 'https://thumbnail.jpg'
       'video_title': 'title',
       'description': 'description',
       'likes': 5 ,
       'liked': true,
       'product_name': 'productName',
       'product_permalink': 'productPermalink',
       'stock_status': 'stockStatus',
     }
    

    Please follow above format data.

    The pageSize is size of list data every time load more data, it affects when to load more data.

    The loadMore is a function to load more data, it is called every time current PageView is at position: listData.length - (pageSize/2)

所屬分類

依賴

依賴清單 2 項

原始碼儲存庫

使用此套件的專案

暫無相關資料。