如果要显示一个居中,字体大小为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);
}
}