1

继上次成功实现了Position API后,我又开始研究鸿蒙的另一个有趣功能——FormLink API。官方文档ts-container-formlink-V5详细介绍了如何实现表单连接(FormLink),这是一个非常强大的功能,能让鸿蒙设备之间实现无缝的信息传递。这一次,我决定带上我的两位朋友——蛋蛋和刘明,一起来学习和开发这个功能。

团队出发:FormLink API的初探

和上次不同,这次我并不孤单。蛋蛋和刘明,一个是搞前端的,一个是爱玩新技术的后端,他们听说我在研究鸿蒙,也想一起尝试。这也让我觉得这次旅程会更加有趣。

我们一起查阅了官方文档,看到了FormLink API可以用来实现组件之间的灵活数据交互,这让我想起了前端中的props传递,只不过在鸿蒙上,组件之间的交互跨越了不同设备的边界。刘明一边看文档一边说:“这感觉就是未来的共享表单功能啊!”

环境搭建与权限申请

我们首先需要创建一个新的鸿蒙应用,用来测试FormLink的功能。在鸿蒙的DevEco Studio中创建项目的步骤对蛋蛋来说完全没问题,而对刘明来说,他第一次用这个开发工具,还有些不太习惯。经过一些调试和摸索,我们终于创建了一个项目,并成功配置了所有依赖。

我们在config.json中申请了必要的权限,确保应用能够正确使用表单连接功能。

{
  "app": {
    "permissions": [
      "ohos.permission.DISTRIBUTED_DATASYNC"
    ]
  }
}

第一次实现FormLink:Hello Form!

为了先了解FormLink的基本用法,我们决定实现一个简单的表单共享功能,允许用户在一台设备上填写信息,然后在另一台设备上查看。蛋蛋提议:“要不我们就叫它‘Hello Form’,先简单实现一下吧。”

于是,我们开始了编码工作。首先,我们需要创建一个表单来承载数据。

import formLink from '@ohos.formlink';

async function createForm() {
  try {
    const formId = await formLink.createForm({
      formName: 'HelloForm',
      deviceType: 'phone'
    });
    console.log('Form created with ID:', formId);
  } catch (error) {
    console.error('Failed to create form:', error);
  }
}

当看到“Form created with ID”在日志中输出时,刘明兴奋地说:“好了,接下来让我们看看怎么把数据填进去吧!”

表单数据填充与跨设备同步

实现表单只是第一步,我们需要进一步实现数据的跨设备共享。我们想做的是,用户在一台设备上输入一些内容,而这些内容能立即同步到另一台设备上。为此,我们用到了connectForm和pushFormData的方法。

import formLink from '@ohos.formlink';

async function createForm() {
  try {
    const formId = await formLink.createForm({
      formName: 'HelloForm',
      deviceType: 'phone'
    });
    console.log('Form created with ID:', formId);
  } catch (error) {
    console.error('Failed to create form:', error);
  }
}

当看到“Form created with ID”在日志中输出时,刘明兴奋地说:“好了,接下来让我们看看怎么把数据填进去吧!”

表单数据填充与跨设备同步

实现表单只是第一步,我们需要进一步实现数据的跨设备共享。我们想做的是,用户在一台设备上输入一些内容,而这些内容能立即同步到另一台设备上。为此,我们用到了connectForm和pushFormData的方法。

async function connectForm(formId) {
  try {
    await formLink.connectForm({
      formId: formId,
      onReceiveData: (data) => {
        console.log('Received data from form:', data);
        // 更新UI以展示接收到的内容
        updateFormUI(data);
      }
    });
    console.log('Form connected successfully');
  } catch (error) {
    console.error('Failed to connect form:', error);
  }
}

async function pushFormData(formId, data) {
  try {
    await formLink.pushFormData({
      formId: formId,
      data: data
    });
    console.log('Data pushed to form successfully');
  } catch (error) {
    console.error('Failed to push data to form:', error);
  }
}

这段代码负责实现表单数据的推送和接收。刘明测试时在设备A上输入了一行文字:“Hello from device A”,然后我和蛋蛋看到在设备B上也同步出现了这行文字,这一刻,大家都很兴奋——它真的工作了!

遇到的挑战与解决方案

在开发过程中,我们遇到了一些挑战。特别是当尝试跨设备连接时,设备之间的延迟和连接稳定性是我们需要考虑的。刘明调侃道:“就像是在约会时找不到对方的位置。”于是,我们决定优化连接的逻辑,确保每次连接都能顺利进行。

我们在代码中添加了一些错误处理和重试机制,确保如果连接失败,可以进行自动重试。

async function retryConnectForm(formId, retryCount = 3) {
  while (retryCount > 0) {
    try {
      await connectForm(formId);
      console.log('Successfully connected form after retry');
      return;
    } catch (error) {
      retryCount--;
      console.warn(`Retrying... Attempts left: ${retryCount}`);
    }
  }
  console.error('Failed to connect form after multiple attempts');
}

这段代码帮助我们在连接失败时,增加了重试的机会,大大提升了连接成功的概率。经过几次测试后,蛋蛋高兴地说:“现在即使出现问题,也能自己恢复啦!”

项目完成:一个多设备互动的小应用

经过不断地优化和调整,我们最终做出了一个小应用,可以在两台设备之间共享表单内容。用户在一台设备上输入数据,另一台设备就能实时同步显示,我们还加入了简单的UI组件来显示这些内容。

function updateFormUI(data) {
  // 假设有一个Text组件显示表单数据
  textComponent.text = `表单内容:${data.content}`;
}

为了让这个小应用更具实用性,我们还增加了历史记录功能,方便用户查看之前输入的内容。

总结与思考:与朋友们的协作学习

与蛋蛋和刘明一起学习和开发FormLink,不仅让我对鸿蒙的开发有了更深入的理解,也体会到了一起探索新技术的乐趣。从最初的环境搭建,到逐步实现表单的创建、数据的跨设备共享,再到最后的优化和功能扩展,这整个过程让我们对鸿蒙的生态有了全新的认识。

最有趣的部分在于,虽然我们每个人的背景和擅长领域各不相同,但在这个项目中,我们各自的能力得到了充分的发挥和互补。蛋蛋的前端经验让UI设计更为友好,刘明则为数据同步的稳定性贡献了许多好点子,而我则更多地充当了架构设计和整体规划的角色。

FormLink API让我意识到,鸿蒙的能力不仅局限于设备内部,而是将跨设备的数据交互变得异常简单,这种特性对于未来的智能家居和物联网应用有着非常大的潜力。下一步,我们计划继续深入探索鸿蒙的其他功能,或许下一个目标就是探索鸿蒙的AI能力,看看它如何与FormLink结合,为用户带来更智能的体验。

总之,这次开发体验充满了惊喜和挑战。希望这篇文章能够为正在学习鸿蒙的你提供一些灵感,也欢迎大家一起加入鸿蒙的探索之旅!


nshen
2.2k 声望156 粉丝