Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 当开发人员选项中的“最小宽度”更改时,颤振UI会中断_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 当开发人员选项中的“最小宽度”更改时,颤振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

我对颤振编程是新手。我一直在开发一个特定的UI,如下所示

如果我尝试更改开发人员选项中的最小宽度选项,并将其设置为默认值以外的其他值,则整个UI将中断,如图所示

我必须补充的是,中间的区域完全被破坏了,这是一个堆栈小部件

@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进行计算,但手动方式也会起作用,并且可以更快地执行。