1.å
³äºJAVAä¸çStack.pop()
2.Underscore源码分析
3.用C语言写的码笔计算器源代码
4.MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
5.Flutter(å)ä¹Flutterçå¸å±Widget
å ³äºJAVAä¸çStack.pop()
å¨JAVAä¸,æStringå½åäºä¸ä¸ªé常åºæ¬çæ°æ®ç±»å,以è³äºä»»ä½ç±»åé½å¯ä»¥è½¬å为String
ä¸ç¥éä½ å¬æ²¡å¬è¿è¿å¥è¯:ä¸ç©ç对象
å¨JAVAéææçç±»é½æ¯ç»§æ¿èªOBJECTç±»,èOBJECTç±»ä¸æä¸ä¸ªæ¹æ³æ¯toString()å°±æ¯è¿åæ¹OBJECTçå符表示,ä¸é¢æ¯JDKä¸çæºç
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
è¿æå°±æ¯å¨JAVAä¸å¦æéå°äºå°ä¸ä¸ªç±»è½¯å为Stringæ¶,è¿ä¸ªç±»ä¼èªå¨è°ç¨toString()æ¹æ³
å¦
class Test{
String name;
public String toString(){
return "aaaa";
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println(new Test());
}
}
è¿è¡å°è¾åº"aaaa"
Underscore源码分析
JavaScript,作为最被低估的码笔编程语言之一,自从Node.js的码笔出现,全端开发(All Stack/Full Stack)概念日渐兴起,码笔现今,码笔其地位不可小觑。码笔美术网站源码JavaScript实质上是码笔一种类C语言,对于具备C语言基础的码笔学习者,理解JavaScript代码大体上较为容易,码笔然而,码笔作为脚本语言,码笔JavaScript的码笔灵活性远超C语言,这在一定程度上给学习者带来了一定的码笔困难。
集合是码笔JavaScript中一种重要的概念,下面我们就来看看其中的码笔q绑查询小工具源码几个迭代方法。
首先,集合中的迭代方法包括`_.each`和`_.forEach`,这两个方法在功能上基本一致,主要用于对集合进行遍历。它们接受三个参数:集合、迭代函数和执行环境。其中,`_.each`和`_.forEach`在ES6中为数组添加了原生的`forEach`方法,但后者更灵活,能够应用于所有集合。
`_.each`和`_.forEach`在遍历时会根据集合的类型(类数组或对象)调用不同的实现。如若集合有`Length`属性且为数字且在0至`MAX_ARRAY_INDEX`之间,则判定为类数组,否则视为对象集合。主力精选指标无未来源码在遍历过程中,`_.each`和`_.forEach`会根据集合的特性使用合适的迭代方式。
在处理集合时,`_.map`和`_.reduce`方法的实现原理类似,`_.map`用于获取集合中元素的映射结果,而`_.reduce`则用于逐元素执行函数并逐步聚合结果。
此外,`_.find`函数与`Array.some()`具有相似性,不同之处在于`_.find`返回第一个使迭代结果为真的元素,而`Array.some()`则返回一个布尔值。`_.find`和`_.detect`函数基于`_.findIndex`和`_.findLastIndex`实现,它们分别在正序和反序的情况下查找满足条件的元素。
在处理集合时,`_.max`方法用于寻找集合中的引用自定义数据公式源码最大值,通过循环比较集合中的所有项,最终返回最大值。`_.toArray`则负责将各种类型的集合转换为数组,确保数据的格式统一。对于数组、类数组对象、普通对象以及null或undefined的情况,`_.toArray`分别采用了不同的处理方式,确保了转换过程的灵活性与准确性。
至于集合转换为数组的问题,JavaScript中的数据类型多样,理解它们之间的区别对于开发者来说至关重要。然而,`_.toArray`函数的飞龙三端互通源码设计似乎更侧重于处理特定类型的数据,而不仅仅基于JavaScript的基本数据类型。在实际应用中,开发者需要根据具体场景灵活运用这些工具,以实现高效、准确的数据处理。
用C语言写的计算器源代码
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef float DataType;
typedef struct
{
DataType *data;
int max;
int top;
}Stack;
void SetStack(Stack *S,int n)
{
S->data=(DataType*)malloc(n*sizeof(DataType));
if(S->data==NULL)
{
printf("overflow");
exit(1);
}
S->max=n;
S->top=-1;
}
void FreeStack(Stack *S)
{
free(S->data);
}
int StackEmpty(Stack *S)
{
if(S->top==-1)
return(1);
return(0);
}
DataType Peek(Stack *S)
{
if(S->top==S->max-1)
{
printf("Stack is empty!\n");
exit(1);
}
return(S->data[S->top]);
}
void Push(Stack *S,DataType item)
{
if(S->top==S->max-1)
{
printf("Stack is full!\n");
exit(1);
}
S->top++;
S->data[S->top]=item;
}
DataType Pop(Stack *S)
{
if(S->top==-1)
{
printf("Pop an empty stack!\n");
exit(1);
}
S->top--;
return(S->data[S->top+1]);
}
typedef struct
{
char op;
int inputprecedence;
int stackprecedence;
}DataType1;
typedef struct
{
DataType1 *data;
int max;
int top;
}Stack1;
void SetStack1(Stack1 *S,int n)
{
S->data=(DataType1*)malloc(n*sizeof(DataType1));
if(S->data==NULL)
{
printf("overflow");
exit(1);
}
S->max=n;
S->top=-1;
}
void FreeStack1(Stack1 *S)
{
free(S->data);
}
int StackEmpty1(Stack1 *S)
{
if(S->top==-1)
return(1);
return(0);
}
DataType1 Peek1(Stack1 *S)
{
if(S->top==S->max-1)
{
printf("Stack1 is empty!\n");
exit(1);
}
return(S->data[S->top]);
}
void Push1(Stack1 *S,DataType1 item)
{
if(S->top==S->max-1)
{
printf("Stack is full!\n");
exit(1);
}
S->top++;
S->data[S->top]=item;
}
DataType1 Pop1(Stack1 *S)
{
if(S->top==-1)
{
printf("Pop an empty stack!\n");
exit(1);
}
S->top--;
return(S->data[S->top+1]);
}
DataType1 MathOptr(char ch)
{
DataType1 optr;
optr.op=ch;
switch(optr.op)
{
case'+':
case'-':
optr.inputprecedence=1;
optr.stackprecedence=1;
break;
case'*':
case'/':
optr.inputprecedence=2;
optr.stackprecedence=2;
break;
case'(':
optr.inputprecedence=3;
optr.stackprecedence=-1;
break;
case')':
optr.inputprecedence=0;
optr.stackprecedence=0;
break;
}
return(optr);
}
void Evaluate(Stack *OpndStack,DataType1 optr)
{
DataType opnd1,opnd2;
opnd1=Pop(OpndStack);
opnd2=Pop(OpndStack);
switch(optr.op)
{
case'+':
Push(OpndStack,opnd2+opnd1);
break;
case'-':
Push(OpndStack,opnd2-opnd1);
break;
case'*':
Push(OpndStack,opnd2*opnd1);
break;
case'/':
Push(OpndStack,opnd2/opnd1);
break;
}
}
int isoptr(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
return(1);
return(0);
}
void Infix(char *str)
{
int i,k,n=strlen(str);
char ch,numstr[];
DataType opnd;
DataType1 optr;
Stack OpndStack;
Stack1 OptrStack;
SetStack(&OpndStack,n);
SetStack1(&OptrStack,n);
k=0;
ch=str[k];
while(ch!='=')
if(isdigit(ch)||ch=='.')
{
for(i=0;isdigit(ch)||ch=='.';i++)
{
numstr[i]=ch;
k++;
ch=str[k];
}
numstr[i]='\0';
opnd= atof(numstr);
Push(&OpndStack,opnd);
}
else
if(isoptr(ch))
{
optr=MathOptr(ch);
while(Peek1(&OptrStack).stackprecedence>=optr.inputprecedence)
Evaluate(&OpndStack,Pop1(&OptrStack));
Push1(&OptrStack,optr);
k++;
ch=str[k];
}
else if(ch==')')
{
optr=MathOptr(ch);
while(Peek1(&OptrStack).stackprecedence>=optr.inputprecedence)
Evaluate(&OpndStack,Pop1(&OptrStack));
Pop1(&OptrStack);
k++;
ch=str[k];
}
while(!StackEmpty1(&OptrStack))
Evaluate(&OpndStack,Pop1(&OptrStack));
opnd=Pop(&OpndStack);
cout<<"你输入表达式的计算结果为"<<endl;
printf("%-6.2f\n",opnd);
FreeStack(&OpndStack);
FreeStack1(&OptrStack);
}
void main()
{
cout<<"请输入你要计算的表达式,并以“=”号结束。"<<endl;
char str[];
gets(str);
Infix(str);
=================================================================
哈哈!给分吧!
MASA Framework源码解读- MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
闲来无事,偶然接触到了MASA Framework,此框架是MASA Stack系列中专门用于构建web系统的开源框架。通过在几个小型项目中的应用,我发现它确实拥有诸多优点。为深入理解其内部结构和设计思路,我决定详细阅读MASA Framework的源代码,并记录整个阅读过程。如有任何错误或疑问,还请各位指正。
MASA Framework是一个功能全面且易于扩展的框架,主要由三个部分组成:BuildingBlocks(抽象层)、Contrib(BuildingBlocks的实现)以及Utils(工具库)。官方将BuildingBlocks称为构建块,实际上,这个层将日常开发中频繁使用到的功能抽象出来,如多租户、多语言、仓储、配置中心等,形成易于替换的接口,大大提高了框架的灵活性和可扩展性。
MASA Framework包含个主要模块,几乎涵盖了日常开发所需的所有组件,从基础服务到高级功能应有尽有。这些模块协同工作,共同构建了一个强大且功能丰富的框架。
让我们从MASA Framework的核心设计——构建工厂(MasaFactory)开始探讨。构建工厂在框架中起着至关重要的作用,它负责通过配置选项来创建不同实现的实例。在实际项目中,构建工厂设计用于解决接口具有多种实现时的依赖注入问题,比如在面对多实现的场景时,如何优雅地注入并使用特定的实现类。以下是构建工厂解决多实现问题的具体步骤:
首先,通过下载MASA Framework的源码(地址:github.com/masastack/MA...)进行研究。我们首先关注的是Masa.BuildingBlocks.Data.Contracts类库的设计。MASA Framework的构建工厂通过选项配置,允许为接口的每个实现类指定一个简短的名称。根据传入的不同名称,构建工厂类的Create方法能够创建对应的实例。
通过使用MASA Framework的构建工厂,我们能够轻松地创建与特定名称对应的面单消息转换类,而无需依赖于IEnumerable集合进行复杂的筛选。这种方法在实现多实现场景时明显更加直观且高效。
以物流面单申请为例,不同销售订单对应不同的商家店铺,而每个商家店铺可能选择不同的物流商。利用MASA Framework构建工厂实现不同物流商的面单申请,不仅简化了开发过程,而且在使用层面保持了无感的效果。
总结而言,MASA Framework提供了强大的构建工厂设计,以解决多实现接口的依赖注入问题,简化了开发流程。这个设计不仅限于构建工厂模块,其他模块同样采用了类似的设计理念,允许用户根据需要替换官方实现或结合自定义实现,以适应不同场景和需求。
MASA Framework的其他模块同样采用了构建工厂的设计,用户既可以替换官方实现,也可以在程序内同时共存官方实现和自定义实现。例如,Service Caller模块不仅支持使用dapr的服务调用,还提供了HTTP服务调用等选项。
Flutter(å)ä¹Flutterçå¸å±Widget
ä¸.ååå¸å±ç»ä»¶
ååå¸å±ç»ä»¶çå«ä¹æ¯å ¶åªæä¸ä¸ªåç»ä»¶ï¼å¯ä»¥éè¿è®¾ç½®ä¸äºå±æ§è®¾ç½®è¯¥åç»ä»¶æå¨çä½ç½®ä¿¡æ¯çã
æ¯è¾å¸¸ç¨çååå¸å±ç»ä»¶æï¼AlignãCenterãPaddingãContainerã
1.1.Alignç»ä»¶1.1.1.Alignä»ç»çå°Alignè¿ä¸ªè¯ï¼æ们就ç¥éå®ææ们ç对é½æ¹å¼æå ³ã
å¨å ¶ä»ç«¯çå¼åä¸ï¼iOSãAndroidãå端ï¼Aligné常åªæ¯ä¸ä¸ªå±æ§èå·²ï¼ä½æ¯Flutterä¸Alignä¹æ¯ä¸ä¸ªç»ä»¶ã
æ们å¯ä»¥éè¿æºç æ¥çä¸ä¸Alignæåªäºå±æ§ï¼
constAlign({ Keykey,this.alignment:Alignment.center,//对é½æ¹å¼ï¼é»è®¤å± ä¸å¯¹é½this.widthFactor,//宽度å åï¼ä¸è®¾ç½®çæ åµï¼ä¼å°½å¯è½å¤§this.heightFactor,//é«åº¦å åï¼ä¸è®¾ç½®çæ åµï¼ä¼å°½å¯è½å¤§Widgetchild//è¦å¸å±çåWidget})è¿éæ们ç¹å«è§£éä¸ä¸widthFactoråheightFactorä½ç¨ï¼
å 为åç»ä»¶å¨ç¶ç»ä»¶ä¸ç对é½æ¹å¼å¿ é¡»æä¸ä¸ªåæï¼å°±æ¯ç¶ç»ä»¶å¾ç¥éèªå·±çèå´ï¼å®½åº¦åé«åº¦ï¼ï¼
å¦æwidthFactoråheightFactorä¸è®¾ç½®ï¼é£ä¹é»è®¤Alignä¼å°½å¯è½ç大ï¼å°½å¯è½å æ®èªå·±æå¨çç¶ç»ä»¶ï¼ï¼
æ们ä¹å¯ä»¥å¯¹ä»ä»¬è¿è¡è®¾ç½®ï¼æ¯å¦widthFactor设置为3ï¼é£ä¹ç¸å¯¹äºAlignç宽度æ¯åç»ä»¶è·¨åº¦ç3åï¼
1.1.2.Alignæ¼ç»æ们ç®åæ¼ç»ä¸ä¸Align:
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}1.2.Centerç»ä»¶1.2.1.Centerä»ç»Centerç»ä»¶æ们å¨åé¢å·²ç»ç¨è¿å¾å¤æ¬¡äºã
äºå®ä¸Centerç»ä»¶ç»§æ¿èªAlignï¼åªæ¯å°alignment设置为Alignment.centerã
æºç åæï¼
classCenterextendsAlign{ constCenter({ Keykey,doublewidthFactor,doubleheightFactor,Widgetchild}):super(key:key,widthFactor:widthFactor,heightFactor:heightFactor,child:child);}1.2.2.Centeræ¼ç»æ们å°ä¸é¢ç代ç Alignæ¢æCenter
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Icon(Icons.pets,size:,color:Colors.red),widthFactor:3,heightFactor:3,);}}1.3.Paddingç»ä»¶1.3.1.Paddingä»ç»Paddingç»ä»¶å¨å ¶ä»ç«¯ä¹æ¯ä¸ä¸ªå±æ§èå·²ï¼ä½æ¯å¨Flutterä¸æ¯ä¸ä¸ªWidgetï¼ä½æ¯Flutterä¸æ²¡æMarginè¿æ ·ä¸ä¸ªWidgetï¼è¿æ¯å 为å¤è¾¹è·ä¹å¯ä»¥éè¿Paddingæ¥å®æã
Paddingé常ç¨äºè®¾ç½®åWidgetå°ç¶Widgetçè¾¹è·ï¼ä½ å¯ä»¥ç§°ä¹ä¸ºæ¯ç¶ç»ä»¶çå è¾¹è·æåWidgetçå¤è¾¹è·ï¼ã
æºç åæï¼
constPadding({ Keykey,@requiredthis.padding,//EdgeInsetsGeometryç±»åï¼æ½è±¡ç±»ï¼ï¼ä½¿ç¨EdgeInsetsWidgetchild,})1.3.2.Paddingæ¼ç»ä»£ç æ¼ç»ï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnPadding(padding:EdgeInsets.all(),child:Text("è«å¬ç©¿ææå¶å£°ï¼ä½å¦¨åå¸ä¸å¾è¡ã竹æèéè½»è马ï¼è°æï¼ä¸èçé¨ä»»å¹³çã",style:TextStyle(color:Colors.redAccent,fontSize:),),);}}1.4.Containerç»ä»¶Containerç»ä»¶ç±»ä¼¼äºå ¶ä»Androidä¸çViewï¼iOSä¸çUIViewã
å¦æä½ éè¦ä¸ä¸ªè§å¾ï¼æä¸ä¸ªèæ¯é¢è²ãå¾åãæåºå®ç尺寸ãéè¦ä¸ä¸ªè¾¹æ¡ãåè§çææï¼é£ä¹å°±å¯ä»¥ä½¿ç¨Containerç»ä»¶ã
.1.Containerä»ç»Containerå¨å¼åä¸è¢«ä½¿ç¨çé¢çæ¯é常é«çï¼ç¹å«æ¯æ们ç»å¸¸ä¼å°å ¶ä½ä¸ºå®¹å¨ç»ä»¶ã
ä¸é¢æ们æ¥çä¸ä¸Containeræåªäºå±æ§ï¼
Container({ this.alignment,this.padding,//容å¨å è¡¥ç½ï¼å±äºdecorationçè£ é¥°èå´Colorcolor,//èæ¯è²Decorationdecoration,//èæ¯è£ 饰DecorationforegroundDecoration,//åæ¯è£ 饰doublewidth,//容å¨ç宽度doubleheight,//容å¨çé«åº¦BoxConstraintsconstraints,//容å¨å¤§å°çéå¶æ¡ä»¶this.margin,//容å¨å¤è¡¥ç½ï¼ä¸å±äºdecorationçè£ é¥°èå´this.transform,//åæ¢this.child,})大å¤æ°å±æ§å¨ä»ç»å ¶å®å®¹å¨æ¶é½å·²ç»ä»ç»è¿äºï¼ä¸åèµè¿°ï¼ä½æ两ç¹éè¦è¯´æï¼
容å¨ç大å°å¯ä»¥éè¿widthãheightå±æ§æ¥æå®ï¼ä¹å¯ä»¥éè¿constraintsæ¥æå®ï¼å¦æåæ¶åå¨æ¶ï¼widthãheightä¼å ãå®é ä¸Containerå é¨ä¼æ ¹æ®widthãheightæ¥çæä¸ä¸ªconstraintsï¼
colorådecorationæ¯äºæ¥çï¼å®é ä¸ï¼å½æå®coloræ¶ï¼Containerå ä¼èªå¨å建ä¸ä¸ªdecorationï¼
decorationå±æ§ç¨åæ们详ç»å¦ä¹ ï¼
1.4.2.Containeræ¼ç»ç®åè¿è¡ä¸ä¸ªæ¼ç¤ºï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Container(color:Color.fromRGBO(3,3,,.5),width:,height:,child:Icon(Icons.pets,size:,color:Colors.white),),);}}1.4.3.BoxDecorationContaineræä¸ä¸ªé常éè¦çå±æ§decorationï¼
ä»å¯¹åºçç±»åæ¯Decorationç±»åï¼ä½æ¯å®æ¯ä¸ä¸ªæ½è±¡ç±»ã
å¨å¼åä¸ï¼æ们ç»å¸¸ä½¿ç¨å®çå®ç°ç±»BoxDecorationæ¥è¿è¡å®ä¾åã
BoxDecoration常è§å±æ§ï¼
constBoxDecoration({ this.color,//é¢è²ï¼ä¼åContainerä¸çcolorå±æ§å²çªthis.image,//èæ¯å¾çthis.border,//è¾¹æ¡ï¼å¯¹åºç±»åæ¯Borderç±»åï¼éé¢æ¯ä¸ä¸ªè¾¹æ¡ä½¿ç¨BorderSidethis.borderRadius,//åè§ææthis.boxShadow,//é´å½±ææthis.gradient,//æ¸åææthis.backgroundBlendMode,//èæ¯æ··åthis.shape=BoxShape.rectangle,//å½¢å})é¨åæææ¼ç¤ºï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Container(//color:Color.fromRGBO(3,3,,.5),width:,height:,child:Icon(Icons.pets,size:,color:Colors.white),decoration:BoxDecoration(color:Colors.amber,//èæ¯é¢è²border:Border.all(color:Colors.redAccent,width:3,style:BorderStyle.solid),//è¿éä¹å¯ä»¥ä½¿ç¨Border.allç»ä¸è®¾ç½®//top:BorderSide(//color:Colors.redAccent,//width:3,//style:BorderStyle.solid//),borderRadius:BorderRadius.circular(),//è¿éä¹å¯ä»¥ä½¿ç¨.onlyåå«è®¾ç½®boxShadow:[BoxShadow(offset:Offset(5,5),color:Colors.purple,blurRadius:5)],//shape:BoxShape.circle,//ä¼åborderRadiuså²çªgradient:LinearGradient(colors:[Colors.green,Colors.red])),),);}}1.4.4.å®ç°åè§å¾åä¸ä¸ä¸ªç« èæ们æå°å¯ä»¥éè¿Container+BoxDecorationæ¥å®ç°åè§å¾åã
å®ç°ä»£ç å¦ä¸ï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}0äº.å¤åå¸å±ç»ä»¶å¨å¼åä¸ï¼æ们ç»å¸¸éè¦å°å¤ä¸ªWidgetæ¾å¨ä¸èµ·è¿è¡å¸å±ï¼æ¯å¦æ°´å¹³æ¹åãåç´æ¹åæåï¼çè³ææ¶åéè¦ä»ä»¬è¿è¡å±å ï¼æ¯å¦å¾çä¸é¢æ¾ä¸æ®µæåçï¼
è¿ä¸ªæ¶åæ们éè¦ä½¿ç¨å¤åå¸å±ç»ä»¶ï¼Multi-childlayoutwidgetsï¼ã
æ¯è¾å¸¸ç¨çå¤åå¸å±ç»ä»¶æ¯RowãColumnãStackï¼æ们æ¥å¦ä¹ ä¸ä¸ä»ä»¬ç使ç¨ã
2.1.Flexç»ä»¶äºå®ä¸ï¼æ们å³å°å¦ä¹ çRowç»ä»¶åColumnç»ä»¶é½ç»§æ¿èªFlexç»ä»¶ã
Flexç»ä»¶åRowãColumnå±æ§ä¸»è¦çåºå«å°±æ¯å¤ä¸ä¸ªdirectionã
å½directionçå¼ä¸ºAxis.horizontalçæ¶åï¼åæ¯Rowã
å½directionçå¼ä¸ºAxis.verticalçæ¶åï¼åæ¯Columnã
å¨å¦ä¹ RowåColumnä¹åï¼æ们å å¦ä¹ 主轴å交åè½´çæ¦å¿µã
å 为Rowæ¯ä¸è¡æå¸ï¼Columnæ¯ä¸åæå¸ï¼é£ä¹å®ä»¬é½åå¨ä¸¤ä¸ªæ¹åï¼å¹¶ä¸ä¸¤ä¸ªWidgetæåçæ¹ååºè¯¥æ¯å¯¹ç«çã
å®ä»¬ä¹ä¸é½æ主轴ï¼MainAxisï¼å交åè½´ï¼CrossAxisï¼çæ¦å¿µï¼
对äºRowæ¥è¯´ï¼ä¸»è½´ï¼MainAxisï¼å交åè½´ï¼CrossAxisï¼åå«æ¯ä¸å¾
对äºColumnæ¥è¯´ï¼ä¸»è½´ï¼MainAxisï¼å交åè½´ï¼CrossAxisï¼åå«æ¯ä¸å¾
2.1.Rowç»ä»¶2.1.1.Rowä»ç»Rowç»ä»¶ç¨äºå°ææçåWidgetææä¸è¡ï¼å®é ä¸è¿ç§å¸å±åºè¯¥æ¯åé´äºWebçFlexå¸å±ã
å¦æçæFlexå¸å±ï¼ä¼åç°é常ç®åã
ä»æºç ä¸æ¥çRowçå±æ§ï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}1mainAxisSizeï¼
表示Rowå¨ä¸»è½´(æ°´å¹³)æ¹åå ç¨ç空é´ï¼é»è®¤æ¯MainAxisSize.maxï¼è¡¨ç¤ºå°½å¯è½å¤çå ç¨æ°´å¹³æ¹åç空é´ï¼æ¤æ¶æ 论åwidgetså®é å ç¨å¤å°æ°´å¹³ç©ºé´ï¼Rowç宽度å§ç»çäºæ°´å¹³æ¹åçæ大宽度
èMainAxisSize.min表示尽å¯è½å°çå ç¨æ°´å¹³ç©ºé´ï¼å½åwidgets没æå 满水平å©ä½ç©ºé´ï¼åRowçå®é 宽度çäºææåwidgetså ç¨çç水平空é´ï¼
mainAxisAlignmentï¼è¡¨ç¤ºåWidgetså¨Rowæå ç¨ç水平空é´å 对é½æ¹å¼
å¦æmainAxisSizeå¼ä¸ºMainAxisSize.minï¼åæ¤å±æ§æ æä¹ï¼å 为åwidgetsç宽度çäºRowç宽度
åªæå½mainAxisSizeçå¼ä¸ºMainAxisSize.maxæ¶ï¼æ¤å±æ§æææä¹
MainAxisAlignment.start表示沿textDirectionçåå§æ¹å对é½ï¼
å¦textDirectionåå¼ä¸ºTextDirection.ltræ¶ï¼åMainAxisAlignment.start表示左对é½ï¼textDirectionåå¼ä¸ºTextDirection.rtlæ¶è¡¨ç¤ºä»å³å¯¹é½ã
èMainAxisAlignment.endåMainAxisAlignment.startæ£å¥½ç¸åï¼
MainAxisAlignment.centerè¡¨ç¤ºå± ä¸å¯¹é½ã
crossAxisAlignmentï¼è¡¨ç¤ºåWidgetså¨çºµè½´æ¹åç对é½æ¹å¼
Rowçé«åº¦çäºåWidgetsä¸æé«çåå ç´ é«åº¦
å®çåå¼åMainAxisAlignmentä¸æ ·(å å«startãendãcenterä¸ä¸ªå¼)
ä¸åçæ¯crossAxisAlignmentçåèç³»æ¯verticalDirectionï¼å³verticalDirectionå¼ä¸ºVerticalDirection.downæ¶crossAxisAlignment.startæ顶é¨å¯¹é½ï¼verticalDirectionå¼ä¸ºVerticalDirection.upæ¶ï¼crossAxisAlignment.startæåºé¨å¯¹é½ï¼ècrossAxisAlignment.endåcrossAxisAlignment.startæ£å¥½ç¸åï¼
2.1.2.Rowæ¼ç»æ们æ¥å¯¹é¨åå±æ§è¿è¡ç®åç代ç æ¼ç»ï¼å ¶ä»ä¸äºå±æ§å¤§å®¶èªå·±å¦ä¹ ä¸ä¸
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.1.3.mainAxisSizeé»è®¤æ åµä¸ï¼Rowä¼å°½å¯è½å æ®å¤ç宽度ï¼è®©åWidgetå¨å ¶ä¸è¿è¡æå¸ï¼è¿æ¯å 为mainAxisSizeå±æ§é»è®¤å¼æ¯MainAxisSize.maxã
æ们æ¥çä¸ä¸ï¼å¦æè¿ä¸ªå¼è¢«ä¿®æ¹ä¸ºMainAxisSize.maxä¼ä»ä¹ååï¼
2.1.4.TextBaselineå ³äºTextBaselineçåå¼è§£æ
2.1.5.Expandedå¦ææ们å¸æ红è²åé»è²çContainerWidgetä¸è¦è®¾ç½®åºå®ç宽度ï¼èæ¯å æ®å©ä½çé¨åï¼è¿ä¸ªæ¶ååºè¯¥å¦ä½å¤çå¢ï¼
è¿ä¸ªæ¶åæ们å¯ä»¥ä½¿ç¨Expandedæ¥å 裹ContainerWidgetï¼å¹¶ä¸å°å®ç宽度ä¸è®¾ç½®å¼ï¼
flexå±æ§ï¼å¼¹æ§ç³»æ°ï¼Rowä¼æ ¹æ®ä¸¤ä¸ªExpandedçå¼¹æ§ç³»æ°æ¥å³å®å®ä»¬å æ®å©ä¸ç©ºé´çæ¯ä¾
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.2.Columnç»ä»¶Columnç»ä»¶ç¨äºå°ææçåWidgetææä¸åï¼å¦ä¼äºåé¢çRowåï¼Columnåªæ¯årowçæ¹åä¸åèå·²ã
2.2.1.Columnä»ç»æ们ç´æ¥çå®çæºç ï¼æ们åç°åRowå±æ§æ¯ä¸è´çï¼ä¸å解é
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.2.2.Columnæ¼ç»æ们ç´æ¥å°Rowç代ç ä¸Rowæ¹ä¸ºColumnï¼æ¥ç代ç è¿è¡ææ
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.3.Stackç»ä»¶å¨å¼åä¸ï¼æ们å¤ä¸ªç»ä»¶å¾æå¯è½éè¦éå æ¾ç¤ºï¼æ¯å¦å¨ä¸å¼ å¾çä¸æ¾ç¤ºæåæè ä¸ä¸ªæé®çã
å¨Androidä¸å¯ä»¥ä½¿ç¨Frameæ¥å®ç°ï¼å¨Web端å¯ä»¥ä½¿ç¨ç»å¯¹å®ä½ï¼å¨Flutterä¸æ们éè¦ä½¿ç¨å±å å¸å±Stackã
2.3.1.Stackä»ç»æ们è¿æ¯éè¿æºç æ¥çä¸ä¸Stackæåªäºå±æ§ï¼
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}6åæ°j解æï¼
alignmentï¼æ¤åæ°å³å®å¦ä½å»å¯¹é½æ²¡æå®ä½ï¼æ²¡æ使ç¨Positionedï¼æé¨åå®ä½çåwidgetãæè°é¨åå®ä½ï¼å¨è¿éç¹æ没æå¨æä¸ä¸ªè½´ä¸å®ä½ï¼leftãright为横轴ï¼topãbottom为纵轴ï¼åªè¦å å«æ个轴ä¸çä¸ä¸ªå®ä½å±æ§å°±ç®å¨è¯¥è½´ä¸æå®ä½ã
textDirectionï¼åRowãWrapçtextDirectionåè½ä¸æ ·ï¼é½ç¨äºå³å®alignment对é½çåèç³»å³ï¼textDirectionçå¼ä¸ºTextDirection.ltrï¼åalignmentçstart代表左ï¼end代表å³ï¼textDirectionçå¼ä¸ºTextDirection.rtlï¼åalignmentçstart代表å³ï¼end代表左ã
fitï¼æ¤åæ°ç¨äºå³å®æ²¡æå®ä½çåwidgetå¦ä½å»éåºStackç大å°ãStackFit.loose表示使ç¨åwidgetç大å°ï¼StackFit.expand表示æ©ä¼¸å°Stackç大å°ã
overflowï¼æ¤å±æ§å³å®å¦ä½æ¾ç¤ºè¶ åºStackæ¾ç¤ºç©ºé´çåwidgetï¼å¼ä¸ºOverflow.clipæ¶ï¼è¶ åºé¨åä¼è¢«åªè£ï¼éèï¼ï¼å¼ä¸ºOverflow.visibleæ¶åä¸ä¼ã
2.3.2.Stackæ¼ç»Stackä¼ç»å¸¸åPositionedä¸èµ·æ¥ä½¿ç¨ï¼Positionedå¯ä»¥å³å®ç»ä»¶å¨Stackä¸çä½ç½®ï¼ç¨äºå®ç°ç±»ä¼¼äºWebä¸çç»å¯¹å®ä½ææã
ä¸ä¸ªç®åçæ¼ç»ï¼
注æï¼Positionedç»ä»¶åªè½å¨Stackä¸ä½¿ç¨ã
classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}7\
åæï¼/post/