Skip to content

可复用的组件属性常量

前面的章节,我们提到过const变量在编译器的优化,一个常量同样的值,在内存中只会被存储一个,所以在组件中使用可复用的组件属性常量,不仅便于组件的维护,而且可以减少组件渲染过程中避免过多的jank,从而提升性能。所以,一定要学会声明可复用的组件属性常量。

什么是可复用的组件属性常量?

组件的属性有很多种,比如Padding里的padding, 一个被重复使用的内置组件SizedBox.shrink(),默认的主题颜色Color配置,borderRadius。他们都是可以被服用的常量,而且有可能同时被多个组件复用。

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

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

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(10),
      child: const Center(child: Text("你好"),),
    );
  }
}

打比方,上面组件中的padding,是一个常量,为了保证UI渲染效果统一,这个padding值,会被不同的组件调用,所以这时候我们就可以将padding属性的值,抽取到一个统一的全局类进行管理,下次给不同的组件进行调用。或者:

dart
const Widget shrinkBox = SizedBox.shrink();

当我们要渲染一个空的组件时,直接使用shrinkBox,就可以避免每次都去创建一个空的组件,在内存中,无论同一个页面中这个组件被调用多少次,占用的内存都是一样的。

Global 类封装

Global类,是一个全局变量的类,里面可以存放复用率较高的全局变量,比如:

dart
class Global {
  static const Color primaryColor = Color(0xFF6200EE);

  const Widget shrinkBox = SizedBox.shrink();

  /// 默认padding
  static const double kDefaultPadding = 10;

  /// 默认组件内部padding
  static const double kDefaultComponentInsetPadding = 10;

  /// scaffold padding
  static const EdgeInsets kScaffoldPadding =
      EdgeInsets.only(left: kDefaultPadding, right: kDefaultPadding);
}

当整个APP组件,或者无限列表不断增加时,他们都可以调用这些常量,这样一来并不会因为每个组件的属性配置差异,导致内存不必要的占用,而且便于后期组件维护。

通过library模式,管理模块

如果你的一个模块较大,你可以使用library *;来进行代码管理。

dart
/// market.dart
library market;

import 'package:flutter/material.dart';

part 'src/market_consts.dart';
part 'src/market_app.dart';

这样的方式,可以让你的代码更加清晰,便于管理。

dart
/// src/market_consts.dart
part of '../market.dart';

class _MarketConsts {
  static const String appName = 'market';
}

src/market_app.dart,则仅导出一个组件。

dart
/// src/market_app.dart
part of '../market.dart';

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

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

你看,这样是不是非常方便的管理了一个内置模块,而且和应用完成解耦。MarketApp只需要继承MaterailApp配置,就可以完成整个应用的渲染。

仅用于培训和测试,通过使用本站代码内容随之而来的风险与本站无关。版权所有,未经授权请勿转载,保留一切权利。
ICP备案号:滇ICP备15009214号-13   公安网备:滇公网安备 53312302000061号