【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget

这篇具有很好参考价值的文章主要介绍了【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget

一、概述

1、Flutter “嵌套地狱”

在Flutter开发中,“嵌套地狱”(Nesting Hell)是指在构建复杂的UI布局时,由于多层嵌套的组件结构,代码变得冗长、难以维护和理解的情况。

Flutter使用组件树的方式来构建用户界面,每个UI元素都是一个组件,可以包含其他组件。在某些情况下,特别是当需要实现复杂的布局或嵌套的组件结构时,代码中的组件嵌套层级可能会不断增加,从而导致出现"嵌套地狱"。

"嵌套地狱"可能会带来以下问题:

  1. 代码冗长和可读性差:过多的嵌套会导致代码变得冗长,难以理解和维护。每个嵌套层级都需要处理相应的组件和属性,使得代码结构复杂化。
  2. 性能问题:过多的嵌套可能会导致渲染性能下降。每个嵌套层级都需要进行布局计算和绘制操作,增加了渲染的负担。
  3. 调试和排查问题困难:当出现UI问题或错误时,由于嵌套层级较多,定位问题可能会变得更加困难。调试和排查错误所需的时间和精力也会增加。

为了避免"嵌套地狱",可以考虑以下策略:

  1. 抽取可复用的组件:将复杂的UI部分拆分为独立的可复用组件,使代码更加模块化和清晰。这样可以减少嵌套层级,并使代码更易读和维护。
  2. 使用布局组件:Flutter提供了各种布局组件(如Row、Column、Stack等),可以帮助管理UI布局。合理使用这些布局组件可以减少嵌套层级,并简化布局代码。
  3. 使用状态管理工具:对于具有复杂交互和状态管理的应用,使用适当的状态管理工具(如Provider、Bloc等)可以减少嵌套层级,并更好地组织和管理应用的状态和逻辑。
  4. 审视UI设计和交互需求:在设计UI和交互时,尽量避免过于复杂和深层次的嵌套结构,简化UI布局和交互流程,以提高代码的可读性和维护性。

2、代码分离实践

结合 flutter_hooks & functional_widget 两个库实现代码分离。

参考文章:

【Flutter 工程】003-钩子函数:Flutter Hooks

https://blog.csdn.net/qq_29689343/article/details/130885106

【Flutter 工程】004-代码生成:functional_widget

https://blog.csdn.net/qq_29689343/article/details/130887815

用一种更有条理的方法写Flutter代码——使用Flutter Hooks与函数式组件

https://blog.csdn.net/qq_50101967/article/details/128688448

二、实践

1、安装 flutter_hooks & functional_widget

# 安装 flutter_hooks
flutter pub add flutter_hooks

# 安装 functional_widget
flutter pub add dev:functional_widget dev:build_runner functional_widget_annotation

2、代码示例

方法是否以$开头有自己决定!

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';

part 'main.g.dart';

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

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

  
  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 HookWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  Widget build(BuildContext context) {
    final counter = Counter.use(0);
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const $OnlyText('You have pushed the button this many times:'),
            $TextWithStyle('${counter.value}'),
            $AddButton(counter.inc),
            $DecButton(counter.dec),
          ],
        ),
      ),
    );
  }
}

/// 逻辑代码
class Counter {
  static use(initialValue) {
    return Counter().._count = useState(initialValue);
  }

  late final ValueNotifier<int> _count;

  get value => _count.value;

  inc() {
    _count.value++;
  }

  dec() {
    _count.value--;
  }
}

/// 样式代码

Widget $onlyText(String text) {
  return Text(text);
}


Widget $textWithStyle(BuildContext context, String text) {
  return Text(
    text,
    style: Theme.of(context).textTheme.headlineLarge,
  );
}


Widget $addButton(final VoidCallback? onPressed) {
  return FloatingActionButton(
    onPressed: onPressed,
    tooltip: 'Increment',
    child: const Icon(Icons.add),
  );
}


Widget $decButton(final VoidCallback? onPressed) {
  return FloatingActionButton(
    onPressed: onPressed,
    tooltip: 'Decrement',
    child: const Icon(Icons.minimize),
  );
}

3、生成代码

命令

# --delete-conflicting-outputs 可选,会在生成代码冲突的时候,删除原来的代码,重新生成
flutter pub run build_runner build --delete-conflicting-outputs

生成的代码

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'main.dart';

// **************************************************************************
// FunctionalWidgetGenerator
// **************************************************************************

/// 样式代码
class $OnlyText extends StatelessWidget {
  /// 样式代码
  const $OnlyText(
    this.text, {
    Key? key,
  }) : super(key: key);

  /// 样式代码
  final String text;

  
  Widget build(BuildContext _context) => $onlyText(text);
}

class $TextWithStyle extends StatelessWidget {
  const $TextWithStyle(
    this.text, {
    Key? key,
  }) : super(key: key);

  final String text;

  
  Widget build(BuildContext _context) => $textWithStyle(
        _context,
        text,
      );
}

class $AddButton extends StatelessWidget {
  const $AddButton(
    this.onPressed, {
    Key? key,
  }) : super(key: key);

  final void Function()? onPressed;

  
  Widget build(BuildContext _context) => $addButton(onPressed);
}

class $DecButton extends StatelessWidget {
  const $DecButton(
    this.onPressed, {
    Key? key,
  }) : super(key: key);

  final void Function()? onPressed;

  
  Widget build(BuildContext _context) => $decButton(onPressed);
}

4、运行结果

【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget文章来源地址https://www.toymoban.com/news/detail-460975.html

到了这里,关于【Flutter 工程】005-代码分离实践:flutter_hooks & functional_widget的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter 最佳实践和编码准则

    最佳实践是一套既定的准则,可以提高代码质量、可读性和可靠性。它们确保遵循行业标准,鼓励一致性,并促进开发人员之间的合作。通过遵循最佳实践,代码变得更容易理解、修改和调试,从而提高整体软件质量。 原文 https://ducafecat.com/blog/flutter-best-practices-and-coding-gui

    2024年02月15日
    浏览(33)
  • Flutter如何集成到已有iOS工程上

    大家好,我是咕噜铁蛋,今天我将和大家分享一个实用的技术教程——如何将Flutter集成到已有的iOS工程中。Flutter是Google推出的一款开源的移动UI框架,它允许开发者使用Dart语言来开发高性能、美观的原生应用,并支持iOS和Android两大平台。然而,在实际开发中,我们经常会遇

    2024年04月12日
    浏览(25)
  • Flutter性能优化实践 —— UI篇

    _clickable = false; } if (vCode.isEmpty || vCode.length 6) { _clickable = false; } if (password.isEmpty || password.length 6) { _clickable = false; } setState(() { }); } MyButton( onPressed: _clickable ? _register : null, text: ‘注册’, ) 其实这里可以优化一下。因为现在的每次输入都必定刷新,我们可以在 _clickable 参数有变化

    2024年04月27日
    浏览(22)
  • flutter实践:Isolate应用实例二

    需求:尝试将Isolate封装一层便于直接使用 实现: 1.定义一个封装类 2.消息传递 在 Dart 中,Isolate 之间的消息传递是通过  SendPort  和  ReceivePort  来实现的。 SendPort  和  ReceivePort  是 Dart 中进行进程间通信的工具。 你可以通过  SendPort  发送消息,然后在对应的  ReceivePor

    2024年02月04日
    浏览(35)
  • Flutter高仿微信-项目实践59篇

    Flutter高仿微信(支持Android和IOS系统) Flutter高仿微信主要包含5大模块: 1、Web服务器 2、Flutter客户端 3、Xmpp即时通讯服务器 4、视频通话服务器 5、腾讯云服务器 另外也有Kotlin版本高仿微信功能,Kotlin版本跟Flutter同时开发,调用的是同一个服务器接口。 六大模块都是我一个人从

    2024年02月02日
    浏览(27)
  • Flutter笔记:Web支持原理与实践

    Flutter笔记 Web支持原理与实践 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com CSDN:https://blog.csdn.net/qq_28550263/article/details/135037756 华为开发者社区:https://bbs.huaweicloud.com/blogs/418443 一个纯 Flutter 构建的 Web 示例站点(建设中): Flutter-Online Top http://

    2024年01月23日
    浏览(27)
  • flutter产物以aar形式嵌入android原生工程

    以前做的项目中,flutter都是作为module嵌入原生工程中,新公司项目却是以aar形式嵌入android工程,这种优点是原生工程不必配置flutter环境也能跑了,这里记录一下简单步骤。 通过android studio创建一个flutter module,注意不要创建成flutter工程了,因为工程没法打包成aar。 创建完成

    2024年02月07日
    浏览(28)
  • Flutter 生成小程序的混合 App 实践

    微信小程序发展的越来越快,目前小程序甚至取代了大部分 App 的生态位,公司的坑位不增反降,只能让原生应用开发兼顾或换岗进行小程序的开发。 以我的实际情况来讲,公司应用采用的 Flutter 框架,同样的功能不可避免的就会存在 Flutter 应用开发和微信小程序开发兼顾的

    2024年02月09日
    浏览(25)
  • Flutter状态管理新的实践 | 京东云技术团队

    1.1 声明式ui 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明式UI是以后的前端发展趋势。而状态管理是声明式UI框架的重要组成部分。 1.2 声明式UI框架的

    2024年02月10日
    浏览(34)
  • Flutter 生成运行小程序的混合App开发实践

    微信小程序发展的越来越快,目前小程序甚至取代了大部分 App 的生态位,公司的坑位不增反降,只能让原生应用开发兼顾或换岗进行小程序的开发。 以我的实际情况来讲,公司应用采用的 Flutter 框架,同样的功能不可避免的就会存在 Flutter 应用开发和微信小程序开发兼顾的

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包