Flutter 当开发人员选项中的“最小宽度”更改时,颤振UI会中断
我对颤振编程是新手。我一直在开发一个特定的UI,如下所示 如果我尝试更改开发人员选项中的最小宽度选项,并将其设置为默认值以外的其他值,则整个UI将中断,如图所示 我必须补充的是,中间的区域完全被破坏了,这是一个堆栈小部件Flutter 当开发人员选项中的“最小宽度”更改时,颤振UI会中断,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我对颤振编程是新手。我一直在开发一个特定的UI,如下所示 如果我尝试更改开发人员选项中的最小宽度选项,并将其设置为默认值以外的其他值,则整个UI将中断,如图所示 我必须补充的是,中间的区域完全被破坏了,这是一个堆栈小部件 @override Widget build(BuildContext context) { return Consumer<SinglePlayerGameState>( builder: (context, gameState, chil
@override
Widget build(BuildContext context) {
return Consumer<SinglePlayerGameState>(
builder: (context, gameState, child) => Expanded(
flex: 48,
child: Container(
color: gameState.getGameColor(),
child: Center(
child: Stack(
overflow: Overflow.visible,
children: <Widget>[
Positioned(
child: Transform.rotate(
angle: 45,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: -30,
left: 90,
),
Positioned(
child: Transform.rotate(
angle: 65,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: 20,
left: 50,
),
Positioned(
child: Transform.rotate(
angle: 180,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: 100,
left: 65,
),
Positioned(
child: Transform.rotate(
angle: 45,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: 10,
right: 10,
),
Positioned(
child: Transform.rotate(
angle: 65,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: 120,
right: 50,
),
Positioned(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: Colors.black),
child: Text(
"${gameState.playingCards.length}",
style: TextStyle(
fontSize: 20,
fontFamily: 'Frijole',
color: Colors.white),
),
padding: EdgeInsets.all(7),
),
top: 10,
left: 10,
),
Positioned(
child: SizedBox(
child: Center(
child: FlatButton(
onPressed: () {
gameState.nextTurn();
},
child: Icon(
FontAwesomeIcons.undoAlt,
size: 25,
),
color: Colors.white,
)),
height: 35,
width: 60,
),
bottom: 10,
left: 10,
),
Positioned(
child: DragTarget<UNOcardData>(
onWillAccept: (UNOcardData data) {
var res = isValidMove(
data, gameState.onGoingCards.last, gameState);
if(res){
print(res);
return true;
}else{
vibrate();
return false;
}
},
onAccept: (UNOcardData data) {
print(data);
performAction(data, gameState);
},
builder: (context, candidateData, rejectedData) =>
Transform.rotate(
angle: 0,
child: gameState.onGoingCards.last,
),
),
top: 60,
right: 100,
),
],
),
),
),
),
);
}
}
就像我们在html/css中使用vmin、vmax、vh等单位来响应文本和大小一样,在flifter中有什么替代方案?我们如何准确地在颤振中创建响应性应用程序?我不是说缩放到其他屏幕尺寸,而是指稍微不同的分辨率和逻辑像素密度
谢谢您的时间。这是因为您使用的是边缘的边距
Positioned(
child: Transform.rotate(
angle: 180,
child: UNOcard(UNOcardData(CardTypes.BACK)),
),
top: 100,
left: 65,
),
这个顶部意味着它将在距离顶部100个单位的位置上定位自己。您实际需要的是从中心偏移一定的百分比。您可以这样做:
Positioned.fill(
child: Align(
// (0, 0) is the center, (1, 1) is right bottom, (-1, -1) is left top and so on
alignment: Alignment(0.25, 0.25),
child: YOUR_WIDGET
)
);
要获得更具响应性的UI,您可以使用或使用类似于根据示例缩放UI的软件包,例如1080x1920屏幕。您可以使用https://pub.dev/packages/auto_size_text 用于自动调整文本大小的插件。从中心排列子对象似乎最合适。是的,这是0.25,0.25意味着小部件将自身定位在从中心到右下角距离的1/4处,应该对所有卡执行此操作,奇妙的方法是对整个小部件列表使用sin和cosin进行计算,但手动方式也会起作用,并且可以更快地执行。