UIWidgets(二)——使用建造者模式改写UIWidgets的常用API

如果要显示一个居中,字体大小为30的Hello World在屏幕上,使用UIWidgets的正常写法是这样

如上图所示,每一个对象都需要使用new关键字构造出来,对于习惯了.net的链式编程的人来说可读性、使用性都很差。下面我使用建造者模式将UIWidgets的常用API封装起来,使用的时候通过链式访问即可(提高可读性,使用性)

下面我将UIWidgets中构建Text,Container,ListView,GestureDetector进行了改写封装,使用时通过链式访问即可

using System.Collections.Generic;
using Unity.UIWidgets.widgets;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.gestures;

/// <summary>
/// 建造器管理(为了使代码结构更加清晰)
/// </summary>
public class BuilderManager
{
    public static TextBuilder Text()
    {
        return new TextBuilder();
    }

    public static ContainerBuilder Container()
    {
        return new ContainerBuilder();
    }

    public static ListViewBuilder ListView()
    {
        return new ListViewBuilder();
    }
}

/// <summary>
/// Text建造器
/// </summary>
public class TextBuilder
{
    private string data = "";//显示的字符串
    private float fontSize = 15;//字体大小
    private int a = 255, r = 0, g = 0, b = 0;//字体颜色
    private FontStyle fontStyle = FontStyle.normal;//字体格式


    /// <summary>
    /// 设置字符串
    /// </summary>
    /// <param name="_data">字符串</param>
    /// <returns></returns>
    public TextBuilder SetData(string _data)
    {
        data = _data;
        return this;
    }

    /// <summary>
    /// 设置字体大小
    /// </summary>
    /// <param name="_fontSize">字体大小</param>
    /// <returns></returns>
    public TextBuilder SetFontSize(float _fontSize)
    {
        fontSize = _fontSize;
        return this;
    }

    /// <summary>
    /// 设置颜色
    /// </summary>
    /// <param name="_a">透明度</param>
    /// <param name="_r">R</param>
    /// <param name="_g">G</param>
    /// <param name="_b">B</param>
    /// <returns></returns>
    public TextBuilder SetColor(int _a, int _r, int _g, int _b)
    {
        a = _a;
        r = _r;
        g = _g;
        b = _b;
        return this;
    }

    /// <summary>
    /// 设置字体格式
    /// </summary>
    /// <param name="_fontStyle">字体格式</param>
    /// <returns></returns>
    public TextBuilder SetFontStyle(FontStyle _fontStyle)
    {
        fontStyle = _fontStyle;
        return this;
    }

    /// <summary>
    /// 建造器
    /// </summary>
    /// <returns></returns>
    public Text EndText()
    {
        return new Text(
            data: data,
            style: new TextStyle(
                fontSize: fontSize,
                color: Color.fromARGB(a, r, g, b),
                fontStyle: fontStyle
                )
            );
    }
}

/// <summary>
/// Container建造器
/// </summary>
public class ContainerBuilder
{
    private Widget child;//Widget对象
    private Alignment alignment = Alignment.topLeft;//对齐方式

    /// <summary>
    /// 设置Widget对象
    /// </summary>
    /// <param name="_child">Widget对象</param>
    /// <returns></returns>
    public ContainerBuilder SetChild(Widget _child)
    {
        child = _child;
        return this;
    }

    /// <summary>
    /// 设置对齐方式
    /// </summary>
    /// <param name="_alignment">对齐方式</param>
    /// <returns></returns>
    public ContainerBuilder SetAlignment(Alignment _alignment)
    {
        alignment = _alignment;
        return this;
    }

    /// <summary>
    /// 建造器
    /// </summary>
    /// <returns></returns>
    public Container EndContainer()
    {
        return new Container(
            child: child,
            alignment: alignment
            );
    }
}

/// <summary>
/// ListView建造器
/// </summary>
public class ListViewBuilder
{
    private List<Widget> children = new List<Widget>();//Widget对象列表
    private float right, left, top, bottom;//上下左右边距

    /// <summary>
    /// 设置Widget对象列表
    /// </summary>
    /// <param name="_children">Widget对象列表</param>
    /// <returns></returns>
    public ListViewBuilder SetChildren(params Widget[] _children)
    {
        children.AddRange(_children);
        return this;
    }

    /// <summary>
    /// 设置Widget对象列表
    /// </summary>
    /// <param name="_children">Widget对象列表</param>
    /// <returns></returns>
    public ListViewBuilder SetChildren(List<Widget> _children)
    {
        children = _children;
        return this;
    }

    /// <summary>
    /// 设置Widget对象列表
    /// </summary>
    /// <param name="_children">Widget对象</param>
    /// <returns></returns>
    public ListViewBuilder SetChild(Widget _children)
    {
        children.Add(_children);
        return this;
    }

    /// <summary>
    /// 设置每条边的边距
    /// </summary>
    /// <param name="_right">右边距</param>
    /// <param name="_left">左边距</param>
    /// <param name="_top"><上边距/param>
    /// <param name="_bottom">下边距</param>
    /// <returns></returns>
    public ListViewBuilder SetPadding_Only(float _right = 0, float _left = 0, float _top = 0, float _bottom = 0)
    {
        right = _right;
        left = _left;
        top = _top;
        bottom = _bottom;
        return this;
    }

    /// <summary>
    /// 设置所有边的边距
    /// </summary>
    /// <param name="_value">边距</param>
    /// <returns></returns>
    public ListViewBuilder SetPadding_All(float _value)
    {
        right = _value;
        left = _value;
        top = _value;
        bottom = _value;
        return this;
    }

    /// <summary>
    /// 建造器
    /// </summary>
    /// <returns></returns>
    public ListView EndListView()
    {
        return new ListView(
            children: children,
            padding: EdgeInsets.only(right: right, left: left, top: top, bottom: bottom)
            );
    }
}

/// <summary>
/// GestureDetector扩展
/// </summary>
public static class GestureDetectorExtension
{
    public static GestureDetector OnTap(this Widget self, GestureTapCallback onTap)
    {
        return new GestureDetector(child: self, onTap: onTap);
    }
}

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/105632910