Flutter点赞功能插件easy_like的使用

Flutter点赞功能插件easy_like的使用

easy_like 插件提供了在应用中实现点赞功能的一种简单而高效的方式。它可以应用于用户资料、上传的照片、帖子和评论等多种实体。

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  easy_like: ^版本号

然后运行 flutter pub get 命令来安装该包。

安全规则

在数据库的安全规则中,确保 likes 字段可以被任何人写入:

{
  "rules": {
    "likes": {
      ".write": "true"
    }
  }
}

术语

  • vote 是执行点赞或取消点赞的动作。
  • like document/likes 集合下的文档。
  • target document 是点赞所指向的原始文档,例如用户文档、帖子文档、评论文档等。

数据库结构

  • /likes/{documentId}: 这里保存了点赞信息。文档ID即为目标文档ID。
  • documentReference: 该字段是目标文档的引用,因此无论任何集合都可以访问目标文档。
  • likedBy: 该字段是进行过点赞的用户UID列表。如果用户取消点赞,则UID将从该字段移除。
  • likeCount: 该字段是点赞数量,可用于搜索目的。

注意,like document ID 与目标文档ID相同。

逻辑

  • 使用事务来增加或减少点赞数。
  • 每当点赞状态发生变化时,必须更新原始文档中的 likeCount 字段。
  • 当用户取消点赞(或再次点赞)时,点赞数量会相应地减少。

显示点赞数量

由于 likeCount 字段保存在文档中,可以直接通过文档显示点赞数量。easy_like 包不提供任何小部件用于显示点赞数量。

以下是如何在帖子详情页面上显示 likeCount 的示例。注意,帖子详情页面应监听数据库更新。

TextButton(
  onPressed: () async {
    final like = Like(uid: my.uid, documentReference: widget.post.ref);
    await like.like();
  },
  child: Text(
    '点赞'.tr(args: {'n': widget.post.likeCount}, form: widget.post.likeCount),
  ),
),

更改图标根据点赞状态

你可以根据点赞状态(点赞或取消点赞)显示不同的小部件。

IconButton(
  onPressed: () async {
    final like = Like(documentReference: post.ref);
    await like.like();
  },
  icon: LikeDoc(
    uid: my.uid,
    documentReference: post.ref,
    sync: true,
    builder: (islike) {
      return FaIcon(
        islike
            ? FontAwesomeIcons.solidHeart
            : FontAwesomeIcons.heart,
        color: Colors.pink[700],
        size: 30,
      );
    },
  ),
)

onLiked 回调

onLiked 是在点赞或取消点赞操作触发后的一个回调函数。可以在其中发送推送通知给其他用户。

以下示例展示了如何在点赞触发后向帖子所有者发送推送通知。它包含了 Like 信息和 isLiked 信息,表示是否已点赞。

LikeService.instance.init(
  onLiked: ({required Like like, required bool isLiked}) async {
    /// 只有在点赞时才发送通知
    if (isLiked == false) return;

    /// 获取点赞文档引用以获取更多信息
    /// 然后根据文档引用决定通知应发送到哪里
    /// 设置推送通知,例如向帖子点赞发送推送通知
    if (like.documentReference.toString().contains('posts/')) {
      Post post = await Post.get(like.documentReference.id);

      /// 如果帖子所有者是登录用户,则不发送通知
      if (post.uid == myUid) return;

      /// 可以根据文档引用获取更多详细信息
      /// 可以在推送通知中提供更多细节
      MessagingService.instance.sendMessageToUids(
        uids: [post.uid],
        title: '你的帖子获得了点赞',
        body: '${my.displayName} 点赞了 ${post.title}',
        data: {
          "action": 'like',
          "source": 'post',
          'postId': post.id,
          'documentReference': like.documentReference.toString(),
        },
      );
    }
  },
);

示例代码

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

import 'package:easy_like/easy_like.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            StreamBuilder(
                stream: FirebaseAuth.instance.authStateChanges(),
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return const CircularProgressIndicator();
                  }
                  if (snapshot.hasError) {
                    return Text(snapshot.error.toString());
                  }
                  if (snapshot.hasData) {
                    return Text('用户已登录: ${snapshot.data?.uid}');
                  }
                  return const Text('用户未登录');
                }),
            ElevatedButton(
              onPressed: () {
                FirebaseAuth.instance.signInAnonymously();
              },
              child: const Text('匿名登录'),
            ),
            ElevatedButton(
              onPressed: () {
                LikeTestService.instance.runTests();
              },
              child: const Text('测试点赞功能'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter点赞功能插件easy_like的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter点赞功能插件easy_like的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用easy_like插件来实现点赞功能的代码示例。easy_like是一个流行的Flutter插件,用于简化点赞功能的实现。

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

dependencies:
  flutter:
    sdk: flutter
  easy_like: ^最新版本号 # 请替换为最新的版本号

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

接下来,让我们创建一个简单的Flutter应用,展示如何使用easy_like插件。

main.dart

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isLiked = false;
  int likeCount = 0;

  void handleLikeChange(bool isLiked, int likeCount) {
    setState(() {
      this.isLiked = isLiked;
      this.likeCount = likeCount;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Easy Like Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            EasyLikeButton(
              isLiked: isLiked,
              likeCount: likeCount,
              likeBuilder: (context, isLiked, likeCount, onLikeChanged) {
                return IconButton(
                  icon: isLiked ? Icon(Icons.thumb_up, color: Colors.red) : Icon(Icons.thumb_up),
                  onPressed: () {
                    onLikeChanged(!isLiked, likeCount + (isLiked ? -1 : 1));
                    handleLikeChange(!isLiked, likeCount + (isLiked ? -1 : 1));
                  },
                );
              },
            ),
            SizedBox(height: 20),
            Text('Like Count: $likeCount'),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖导入

    • 我们导入了flutter/material.dart用于基本的UI组件。
    • 导入easy_like/easy_like.dart来使用EasyLikeButton
  2. 主应用

    • MyApp是我们的主应用,它包含一个MaterialApp
    • MyHomePage是我们的主页,它包含主要的点赞逻辑。
  3. 状态管理

    • isLikedlikeCount用于存储当前点赞状态和点赞数量。
    • handleLikeChange方法用于更新UI状态。
  4. EasyLikeButton

    • EasyLikeButton是一个自定义按钮,它接受isLikedlikeCount参数,并允许我们提供一个likeBuilder来自定义按钮的UI。
    • likeBuilder中,我们返回一个IconButton,并根据isLiked状态显示不同的图标。
    • 当按钮被点击时,我们调用onLikeChanged回调来更新点赞状态,并调用handleLikeChange方法来更新UI状态。

这个示例展示了如何使用easy_like插件来创建一个简单的点赞功能。你可以根据需要进一步自定义和扩展这个示例。

回到顶部