将 Stipop Stickers 与 Stream Flutter 应用程序集成

uni-app 和 Flutter 打包上架 iOS 频繁触发 4.3 (a):原因拆解与合规处理路径 跨端方案让 iOS 上架的门槛降低了,但也带来一个明显的副作用 ——4.3 (a) 的命中率显著高于原生项目。很多开发者不理解:业务代码明明是自己写的,为什么还会被判为重复应用。这篇专门讲跨端场景,把原因和可走的路径讲清楚。 阅读详情

今天我们将继续探索有关 Stream 聊天 SDK 的更多信息。

Stream 是最受欢迎的聊天 SDK 之一,具有实时聊天消息功能,功能非常丰富,通过整体应用内转换、参与度和最终用户的保留提供出色的聊天体验。它的 API 可以在单个聊天频道中支持多达 500 万个以上的并发连接,没有任何问题,并且很容易与 Kotlin、Swift、Flutter 等任何技术堆栈集成,仅举几例。

在这篇文章中,我们将把 Stream Chat SDK 集成到 Flutter 应用程序中,然后使用 Stipop贴纸来获得流畅的聊天体验🤞 好兴奋哦!!

先决条件

  • 使用 Android Studio Flutter
  • Android SDK(API 16 或更高版本)
  • Xcode 和 iOS(10.0 或更高版本)
  • Stream Flutter SDK
  • Stipop Flutter SDK
  • Java 8
  • Android X
  • Gradle 3.5.4 或更高版本

那么,让我们开始吧

获取流 API 密钥和秘密

我们需要一个 Stream API 密钥来为我们的 Android 项目启用 Stream SDK。登录到 Stream Dashboard 并创建一个免费帐户。您将能够在仪表板上看到 API 密钥,并在生产发布期间将其放在手边。

现在单击创建应用程序并根据您选择的满足您的应用程序要求的 Stream SDK 配置填写表格。

在此之后,您将能够在 Stream Dashboard 上看到 API Key 和 API Secret。请妥善保管它们以备后续步骤使用。

创建频道和用户

要测试聊天功能,我们需要一些用户/频道帐户。我们可以在工具栏中的Chat/Explorer/ 选项下的 Stream Dashboard 上创建用户。在用户选项下,单击创建新用户并传递身份、用户 ID,然后选择适当的角色。

完成后,我们现在将创建一个频道并绕过用户 ID 添加成员,以便该特定用户可以发送/接收消息。


让我们开始吧 -

集成 Stream Flutter SDK

由于我们必须同时集成 Stream 和 Stipop Flutter SDK,我们将从克隆 Stipop Flutter GIT 存储库开始,为什么?这样一个带有内置 Stipop SDK 的基本 Flutter 容器就可以进行集成了。

git clone 
https://github.com/stipop-development/stipop-flutter-sdk.git

假设 - 已经安装了带有 Android Studio 的 Flutter。现在stipop-flutter-sdk在 Android Studio 中打开。它将获取依赖项并自动同步项目。导航到该example/ pubspec.yaml文件并添加 Stream Flutter 依赖项。

dependencies:
 flutter:
   sdk: flutter
 stream_chat_flutter: ^3.1.1
stipop_sdk:
   path: ../

运行 flutter pub get 命令,以便获取 Stream 库并同步项目。现在我们准备好使用 Stream 类并构建聊天应用程序了。

现在很兴奋 让我们构建聊天应用程序🤟✨

👊 第 1 步: 使用 API 机密和用户 ID 作为输入参数,从jwt.io获取 JWT 身份验证令牌

👊 第 2 步:为 API 调用设置 Stream Chat 客户端,并使用第 1 步中的 API 密钥和 JWT 身份验证令牌。

import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
final client = StreamChatClient(
 'YOUR_API_KEY',
 logLevel: Level.INFO,
);

await client.connectUser(
 User(id: 'user01'),
 'JWT_AUTH_TOKEN',
);

👊步骤3:修改MyApp组件以使用默认StreamChat容器并传递客户端对象和ChannelListPage作为主屏幕参数。

class MyApp extends StatelessWidget {
 const MyApp({
   Key? key,
   required this.client,
 }) : super(key: key);

 final StreamChatClient client;

 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     builder: (context, child) => StreamChat(
       client: client,
       child: child,
     ),
     home: const ChannelListPage(),
   );
 }
}

👊第4步:我们将ChannelBloc用作主体,并ChannelListView显示频道列表。此外,在点击频道时,它将打开StreamChannel特定频道的屏幕。

class ChannelListPage extends StatelessWidget {
const ChannelListPage({
   Key? key,
 }) : super(key: key);
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     body: ChannelsBloc(
       child: ChannelListView(
         filter: Filter.in_(
           'members',
           [StreamChat.of(context).currentUser!.id],
         ),
         sort: const [SortOption('last_message_at')],
         limit: 20,
         channelWidget: ChannelPage(),
         onChannelTap: (channel, widget) {
           Navigator.push(
             context,
             MaterialPageRoute(
               builder: (context) => StreamChannel(
                 channel: channel,
                 child: widget!,
               ),
             ),
           );
         },
       ),
     ),
   );
 }
}

👊步骤 5: 让我们构建ChannelPage具有内置 Stream 组件的布局:

ChannelHeader作为appBar.
MessageListView显示频道中交换的消息列表。
MessageInput布局以键入消息并包括附件按钮、Stipop 按钮、表情符号等。

class ChannelPage extends StatefulWidget {
 @override
 _ChannelPageState createState() => _ChannelPageState();
}

class _ChannelPageState extends State<ChannelPage> {
 Message? quotedMessage;

@override
Widget build(BuildContext context) {
 return Scaffold(
   appBar: const ChannelHeader(),
   body: Column(
     children: <Widget>[
       Expanded(
         child: MessageListView(
           // ...
           messageBuilder: _messageBuilder,
           onMessageSwiped: (message) {
             setState(() {
               quotedMessage = message;
             });
           },
         ),
       ),
       MessageInput(
         actions: [
           InkWell(
             child: Icon(
               Icons.emoji_emotions,
               size: 20.0,
               color: StreamChatTheme.of(context).colorTheme.accentPrimary,
             ),
             onTap: () {
               // integrate the stipop keyboard here
             },
           ),
         ],
         quotedMessage: quotedMessage,
disableAttachments: true,
         onQuotedMessageCleared: () {
           setState(() => quotedMessage = null);
         },
       ),
     ],
   ),
 );
}

在 iOS/Android 上运行应用程序
对于 iOS - 我们必须设置 pod 文件并安装组件。此外,启动 iOS 模拟器并使其保持运行以备将来部署。

pod install
open -a Simulator

测试时间 BRAVO 😎!!

将目标设置为 iOS 模拟器,然后在 Android Studio 中点击运行按钮 ( cmd + R )。


太棒了✌我们能够成功运行 Stream Flutter 聊天应用程序。我们可以发送一些在内部使用 Stream API 的消息来保存消息。现在我们将继续将 Stipop Flutter SDK 集成到我们的 Stream Chat 应用程序中。

获取 Stipop SDK 配置

我们将需要 API 密钥来将 Stipop SDK 集成到我们现有的 Stream Flutter 应用程序中。登录到 Stipop Dashboard,并创建一个免费帐户。成功登录后,创建一个应用程序名称,地区等

您现在将能够Stipop.json在 android 设置和Stipop.plistiOS 设置下看到 API 密钥并下载文件,如下所示。


您需要将Stipop.json文件放在example/android/app/src/main/assets/Stipop.json下以针对 Android 设备。同样,要针对 iOS 设备,请将 Stipop.plist 文件放在 example/ios/Runner/Stipop.plist 目录下。

最后,你们一直在等待什么🤩…

集成 Stipop Flutter SDK

由于我们已经克隆了 Stipop Github repo,所以 Stipop 类现在已经可以使用了。我们将继续在 Stream Chat 布局中集成 Stipop。

让我们导入stipop_plugin类,声明一个 Stipop 实例,并stickerImg包含所选贴纸的 URL。

import 'package:stipop_sdk/stipop_plugin.dart';
class _ChannelPageState extends State<ChannelPage> {
late Stipop stipop;
String callbackMsg = '';
String? stickerImg = null;

@override
void initState() {
 super.initState();
 stipop = Stipop(
   'a01',
   languageCode: 'en',
   countryCode: 'US',
   onStickerPackSelected: (spPackage) {
     setState(() {
       callbackMsg = 'onStickerPackSelected\n${spPackage.toJson()}';
       stickerImg = null;
     });
   },
   onStickerSelected: (sticker) {
     setState(() {
       callbackMsg = 'onStickerSelected\n${sticker.toJson()}';
       stickerImg = sticker.stickerImg;
     });
   },
 );
}

然后初始化stipop实例并覆盖onStickerSelected()andonStickerPackSelected()方法。我们将使用setState()将当前选择的贴纸 gif url 保存到stickerImg.

现在我们将添加 Stipop 按钮(笑脸😊),它将打开 Stipop 贴纸键盘以选择贴纸。将按钮作为图标放置在Messageinput.actions块内。

@override
Widget build(BuildContext context) {
 return Scaffold(
   appBar: const ChannelHeader(),
   body: Column(
     children: <Widget>[
       Expanded(
child: MessageListView(
           // ...
           messageBuilder: _messageBuilder,
           onMessageSwiped: (message) {
             setState(() {
               quotedMessage = message;
             });
           },
         ),
       ),
       MessageInput(
         actions: [
           InkWell(
             child: Icon(
               Icons.emoji_emotions,
               size: 20.0,
               color: StreamChatTheme.of(context).colorTheme.accentPrimary,
             ),
             onTap: () {
               print("showing stipop keyboard");
               stipop.showKeyboard();

              // stipop.showSearch();
             },
           ),
         ],
quotedMessage: quotedMessage,
         disableAttachments: true,
         onQuotedMessageCleared: () {
           setState(() => quotedMessage = null);
         },
       ),
     ],
   ),
 );
}

因此,在 Stipop 按钮的点击动作上,我们可以分别通过调用showKeyboard()或showSearch()方法打开贴纸键盘或贴纸搜索布局。

👉Please note that we are using state management to update the current sticker URL when a sticker is selected.

_messageBuilder小部件组件将为每个消息项创建布局。在这个方法中,我们获得了message每条文本消息将被一一呈现的实例。它将返回_messageContainer()呈现消息项布局的方法。

Widget _messageBuilder(
 BuildContext context,
 MessageDetails details,
 List<Message> messages,
 MessageWidget defaultMessageWidget,
) {
 final message = details.message;

 Message current_message = messages.first;

 if (message.text!.isNotEmpty) {
   return Padding(
     padding: const EdgeInsets.all(5),
     child: _messageContainer(message, current_message),
   );
 } else {
   return Container();
 }
}

在 中_messageContainer,我们显示messageText、authorNameText,并包含*_stickerImage*当用户从贴纸键盘选择任何 gif 时呈现 Stipop gif 的布局。

Widget _messageContainer(message, current_message) {
 final isCurrentUser =
     StreamChat.of(context).currentUser!.id == message.user!.id;

 final textAlign = isCurrentUser ? TextAlign.right : TextAlign.left;
final color = isCurrentUser ? Colors.blueGrey : Colors.blue;

 return Container(
     decoration: BoxDecoration(
       border: Border.all(
         color: color,
       ),
       borderRadius: const BorderRadius.all(
         Radius.circular(5),
       ),
     ),
     child: Column(
       children: <Widget>[
         ListTile(
           title: Text(
             message.text!,
             textAlign: textAlign,
           ),
           subtitle: Text(
             message.user!.name,
             textAlign: textAlign,
           ),
         ),
         _stickerImage(message, current_message),
       ],
     ));
}

正如我们从 中看到的_stickerImage,我们检查 是否stickerImg有一些值,然后将图像 Url 加载到_messageContainer.

Widget _stickerImage(message, last_message) {
 if (stickerImg != null && message == last_message) {
   return Image.network(
     stickerImg!,
     width: 100,
     height: 100,
   );
 } else {
   return Container();
 }
}

这就是我们必须做的所有编码。您只需要一杯咖啡或茶以及一些编码时间,这将为您带来魔力。

您现在可以运行该应用程序进行测试。您可以在 Inputbox 布局的左角看到 Stipop 按钮(笑脸😊)。单击它会打开 Stipop 贴纸键盘以选择贴纸。


瞧!👏🏻👏🏻 与往常一样,集成 Stipop SDK 总是很容易,因为它具有内置的贴纸键盘和贴纸搜索选项,使其成为任何聊天应用程序的绝佳补充。
如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击文末卡片免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

chat_ui_stream_ii_example:让我们使用StreamChat和Firebase将聊天室和故事集成到我们的Flutter聊天应用程序中 Flutter教程-使用StreamChat的#2聊天UI 让我们使用StreamChat和Firebase将聊天室和故事集成到我们的Flutter聊天应用程序中。 :high_voltage: 社交媒体 YouTube: 推特: Instagram: 脸书: LinkedIn) GitHub: 媒介: 网站: :victory_hand: 预习 应用预览 课程预览 ➜ :television: 看视频 解释源代码的。 ➜ 立即下载

相关推荐

stream-chat-react:流聊天官方React SDK

官方React SDK用于 Stream Chat的官方React组件,用于构建聊天应用程序的服务。 快速链接 以获取用于Stream Chat的API密钥 使用这些聊天组件,您可以支持任何聊天用例: Twitch或Youtube等直播 游戏中聊天,例如《守望先锋》或《堡垒之夜》 像Slack这样的团队风格聊天 消息风格的聊天,例如Whatsapp或Facebook的Messenger 像Drift或Intercom之类的商务聊天 React聊天教程 最好的起点是 。 它教您如何使用此SDK,并说明如何进行经常性的更改。 安装 使用NPM安装 npm install --save react react-dom stream-chat stream-chat-react 用纱安装 yarn add react react-dom stream-chat stream-chat-

探索高效流畅的聊天体验:Stream Chat Flutter SDK

在当今的移动应用开发中,集成实时聊天功能已经成为提升用户体验的关键。Stream Chat Flutter SDK 是一个强大的工具集,专为构建高性能、高可用性的聊天解决方案而设计。这个开源项目不仅提供了底层客户端,还包含了丰富的UI组件,使得在Flutter平台上实现聊天功能变得轻而易举。 ## 项目介绍 Stream Chat Flutter SDK 提供了一系列dart包,包括 `str...

gitblog_00057的博客 674

普通人也能看懂的Transformer源代码解释(PyTorch)

Transformer源代码解释之PyTorch篇 章节 词嵌入 位置编码 多头注意力 搭建Transformer 在这里插入图片描述 词嵌入 Transformer本质上是一种Encoder,以翻译任务为例,原始数据集是以两种语言组成一行的,在应用时,应是Encoder输入源语言序列,Decoder里面输入需要被转换的语言序列(训练时)。一个文本常有许多序列组成,常见操作为将序列进行一些预处理(如词切分等)变成列表,一个序列的列表的元素通常为词表中不可切分的最小词,整个文本就是一个大列表,元素为一个一

qq_50974223的博客 4170

Flutter中stream学习

Stream 主要应用于 Flutter 的异步操作,在其他编程语言中也存在;Stream 提供了一种接受事件队列的方法,可通过 listen 进行数据监听,通过 error 接收失败状态,通过 done 来接收结束状态;

yong_19930826的博客 1040

用VINS-Fusion跑通EuRoC数据集:Ubuntu22.04+ROS2环境下的保姆级评测指南

本文详细介绍了在Ubuntu22.04和ROS2 Humble环境下使用VINS-Fusion处理EuRoC数据集的完整流程。从环境配置、数据集转换到参数调优和性能评估,提供了一套全面的多传感器融合分析方案,帮助开发者在无人机精准定位场景中实现高效部署与优化。

weixin_29212867的博客 518

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 354

Flutter----Stream讲解

Stream Stream在Flutter中也是属于非常关键的概念,就好比前面我有写过一篇event_bus的文章,我就是用Stream去做的,有兴趣的可以去前面看看。 在Flutter中,状态管理出了本身自带的InheritedWidget之外,还有什么rxdart,Bolc,redux,provider以及别的大佬们写的插件。但是不管是什么状态管理的模式,我看到的基本都是离不开Stream的封...

mubowen666的博客 3331

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 736

Flutter中非常优秀的分层架构

Flutter 分层架构

lebsharing的专栏 1704

告别社区5级:一个脚本搞定小米/红米BL解锁的账号绑定限制(附资源下载与避坑指南)

本文提供了一种绕过小米/红米设备Bootloader解锁社区等级限制的技术方案,适用于MIUI 12.5-14和HyperOS 1.0系统。通过自动化脚本临时修改系统组件,用户可快速完成账号绑定和设备解锁流程,附详细操作指南和常见问题解决方案。

weixin_27330481的博客 734

STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联

STM32G4电机控制外设应用笔记摘要:本文详细介绍了TIM1高级定时器生成三对互补PWM波的配置方法(预分频器PSC=30000,重装载值ARR=10000),重点说明需断开电机连线避免干扰。通过STM32CubeMX配置TIM1通道4触发ADC采样,设置RCR分频参数,并给出Keil代码修改要点。第二部分探讨了TIM1、ADC、比较器和DAC的级联应用,包括电流采样触发时序(在PWM波峰值前采样)和过流保护机制。配置步骤包含DAC3作为比较器负输入端、设置Break触发封波保护,并附关键代码段实现外设联

qq_43091070的博客 1102

Flutter完整开发实战详解(十一、全面深入理解Stream)

作为系列文章的第十一篇,本篇将非常全面带你了解 Flutter 中最关键的设计之一,深入原理帮助你理解 Stream 全家桶,这也许是目前 Flutter 中最全面的 Stream 分析了。 前文: 一、 Dart语言和Flutter基础 二、 快速开发实战篇 三、 打包与填坑篇 四、 Redux、主题、国际化 五、 深入探索 六、 深入Widget原理 七、 深入布局原理 八、 实用技巧与填...

weixin_33785108的博客 2058

MIPI C-PHY介绍(Specification for C-PHY V1.2)

本文档描述了一个名为C-PHY的高速串行接口,它在带宽有限(bandwidth limited channels,看的有人说C的含义就是channel limit)的通道上提供高吞吐量性能,用于连接到外设,包括显示器和摄像头。首先0x4fff在0x4000~0x4fff区域,则f=(0,0,0,0,0,0,1),顺序是S6~S1;最后,端到端的传输过程是什么样呢,如下图所示,16bit先转换成7个符号(每个符号3位,共21位),然后并行数据转换成串行数据,输送到符号编码器和3个线的驱动器,接收端流程相反。

qflook的博客 5884

Flutter 聊天页面及功能开发

用flutter开发了一个聊天页面 支持发视频,语音,图片,有需要的可以参考一下. 目前功能还不是特别完美,发送语音不太理想,实在找不到好的解决方案了,如果哪位有好的方案,可以给我留言,多多指教 效果如下: import 'dart:async'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:fl...

陈振涛 1万+

DJI O2协议物理层逆向工程解析:揭开无人机通信的神秘面纱

DJI的O2协议是其OcuSync传输技术的最新演进,应用于Mini 2、Mavic Air 2、Mavic Air 2s和Mavic 3等无人机模型。这种协议结合了多种先进无线通信技术,能够在远距离提供稳定可靠的低延迟连接。O2协议物理层(PHY)是OSI模型的最底层,负责在物理媒介上传输原始数据比特流。它定义了电气特性、调制方式、编码方案、数据传输速率和同步机制等。DJI O2协议的物理层逆向工程是一个复杂但极具价值的领域。

QQ_778132974的博客 2389

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

flutter之stream

1.前言 在Dart库中,有两种实现异步编程的方式(Future和Stream),使用它们只需要在代码中引入dart:async即可。 本文主要介绍Stream的相关概念及利用其异步特性来实现简单的响应式编程。 2.什么是Stream? 为了将Stream的概念可视化与简单化,可以将它想成是管道(pipe)的两端,它只允许从一端插入数据并通过管道从另外一端流出数据。 在Flutter中, 我们将这样的管道称作Stream; 为了控制Stream,我们通常可以使用StreamController来进

sundaysme的博客 2511

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

小程序语音聊天_如何将语音消息集成到您的流聊天应用程序中

小程序语音聊天A voice message is a message containing audio of one’s voice. They have been around for quite a while and have been widely adopted by users around the world as a convenient way of sending norma...

weixin_26717681的博客 527

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Flutter踩坑排雷】第26课:Hero 标签冲突坑|多Hero标签重名,页面转场动画错乱修复

本文剖析 Flutter 中 Hero 标签冲突的四大典型场景:默认 FloatingActionButton 的隐性重名、动态列表中 tag: index 的重复、flightShuttleBuilder 中 GlobalKey 碰撞,以及嵌套 Navigator 的 tag 可见性问题。从源码层面揭示 tag 作为匹配键的唯一性要求,强调索引与位置非稳定身份,数据 ID 才是可靠标识。提出五步排查法与分层修复策略,并建立“禁止索引标签”“命名空间约定”等预防契约,确保转场动画稳定可靠。核心结论:tag

jackchuanqi的博客 415

【Flutter踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”

本文剖析ScrollController作为“附加句柄”而非“滚动位置本身”的核心机制,揭示其在build中创建、未检查hasClients、addPostFrameCallback失效及dispose遗漏等四大典型故障的根因。通过五步排查法与五层修复方案,系统性解决滚动失效、监听器泄漏等问题,并提出可审查的预防原则,将“玄学问题”转化为确定性实践。

jackchuanqi的博客 374

Flutter学习day10--shared_preferences与离线优先

大多数 App 的第一版都长这样:页面数据全部来自网络,网一断,界面直接开天窗。用户不会去研究你的代码写得漂不漂亮,他们只记得"这个 App 断网就白屏"。这一篇我们解决两件事:怎么把数据存到手机本地(shared_preferences),以及怎么用"离线优先"模式让页面断网时依然有内容可看。这两点是 Flutter 客户端数据层的地基,也是网络请求(W4 前几篇)之后顺理成章的下一步。

qq_63223749的博客 294

【flutter封装图片/视频选择控件二】

【代码】【flutter封装图片/视频选择控件二】

androidhyf的博客 26

【flutter简单的MethodChannel通道封装2】

【代码】【flutter简单的MethodChannel通道封装2】

androidhyf的博客 21

Flutter学习day11--Sliver滚动体系与折叠头部

几乎每个 App 的第一屏都是列表:首页信息流、频道页、商品瀑布流、带折叠头部的个人主页。Flutter 把这一整套滚动能力归拢成一个体系——。能不能把滚动写对、写顺,直接决定页面的流畅度和代码的可维护性。这篇要解决三个递进的问题:普通ListView有哪几种构造方式、为什么Column里嵌ListView会报错、以及什么时候该升级到+ Sliver 家族去实现"折叠头部 + 网格 + 列表"这种复合页面。

qq_63223749的博客 312

Flutter 搭建配制教程

本文详细介绍了在Windows上搭建Flutter开发环境的完整流程,包括下载并配置Dart SDK与Flutter SDK、设置国内镜像加速下载、配置系统环境变量,以及使用VSCode进行开发。重点说明了如何安装必要插件(Dart、Flutter、CodeRunner等)、创建项目、运行调试,并对比了VSCode与AndroidStudio的适用场景。强调一套Dart代码可跨平台运行,仅在需原生功能时才涉及iOS/Swift或安卓/Kotlin开发,适合初学者快速上手Flutter全栈开发。

u013519290的博客 235

flutter ios 4.3.a被拒整改方案

本文分享了团队首次推进Flutter项目iOS上架时遭遇4.3.a审核被拒的全过程。历经四次提审失败,因未深入分析根本原因,仅做局部优化,导致问题反复。最终通过复盘、整理被拒文档、结合元数据与IPA-Diff工具分析,发现核心问题是二进制代码相似度过高,源于Flutter项目未深度重构。遂开展为期两周的系统性整改:重构Dart代码、清理冗余、升级Flutter版本、优化元数据与UI设计,降低二进制指纹至0.23,成功通过审核。强调海外上架需环境隔离、专用设备,并愿免费协助解决同类问题。

zdgdq的专栏 222

Flutter学习day9--http与Dio网络请求入门

前几周的界面无论多精致,数据都是写在代码里的常量。真实 App 的核心能力是:列表来自接口、提交落回后端。Flutter 生态里最常用的两条路是官方的http包和社区事实标准的Dio——前者适合理解网络层的本质,后者适合真实项目。这篇把两条路都走一遍,并整理一套可直接复用的请求套路。

qq_63223749的博客 291
上一篇: 使用调试日志在 Activity 和 View Model 中演示 Android 生命周期的简单应用
下一篇: Android中的显性Intent与隐性Intent
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值