Flutter: 层叠布局 - Stack 与 Position

2019-02-15  本文已影响0人  LiYaoPeng

我是层叠布局 的搬运工
Flutter 布局(八)- Stack、IndexedStack、GridView详解

居中

Stack

  1. 其childWidget 可以层叠到一起,层叠顺序:Widget越后创建,层级越靠上
  2. 可以控制没有定位的childWidget的布局策略
Stack({
  this.alignment = AlignmentDirectional.topStart,
  this.textDirection,
  this.fit = StackFit.loose,
  this.overflow = Overflow.clip,
  List<Widget> children = const <Widget>[],
})

IndexedStack

继承自Stack,表示只显示第几个widget,其他隐藏

Positioned

const Positioned({
  Key key,
  this.left, 
  this.top,
  this.right,
  this.bottom,
  this.width,
  this.height,
  @required Widget child,
})
  1. left、right、bottom、top分别表示 距离stack的边的距离
  2. width、height表示宽高。Widget在指定left与width后,就自动确定了right。如果在设置right,则报错。其他情况(指定top与height,不能再指定bottom等)类似。
  3. 只能在Stack 的childs中使用。目前测试,在其他的Widget中使用会报错。
import 'package:flutter/material.dart';
import 'package:vector_math/vector_math_64.dart' as Vector;

void main() {
  runApp(MaterialApp(
    home: MyApph(),
  ));
}

class MyApph extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Stack"),
        ),
//body: Positioned(child: Text("101010")));// 报错
        body: MainView(EdgeInsets.all(10)));
  }
}

class MainView extends StatelessWidget {
  EdgeInsets _space = EdgeInsets.all(0);

  MainView(this._space);

  @override
  Widget build(BuildContext context) {
    return ConstrainedBox(
      constraints: BoxConstraints(
        maxHeight: 400,
      ),

      child: Stack(
//      child: IndexedStack( // indexedStack 继承自Stack,表示显示第几个widget
//        index: 2,
        fit: StackFit.expand,

        ///扩展到stack大小
        alignment: AlignmentDirectional.center,
        children: <Widget>[
          Container(
            color: Color.fromARGB(100, 200, 100, 0),
          ),
          Positioned(
            height: 60,
            left: 10,
            right: 10,
            top: 10,
            child: Padding(
              padding: EdgeInsets.all(10),
              child: Container(
                color: Color.fromARGB(100, 50, 100, 0),
                child: Center(
                  child: Text(
                    "我设置了左右约束,所以 stack alignment 对我无效",
                    style: TextStyle(color: Color.fromARGB(200, 50, 50, 0)),
                  ),
                ),
              ),
            ),
          ),
          Positioned(
            height: 200,
            width: 200,
            child: Padding(
              padding: EdgeInsets.all(10),
              child: Container(
                color: Color.fromARGB(100, 100, 100, 0),
              ),
            ),
          ),
          Positioned(
            height: 100,
            width: 100,
            child: Padding(
              padding: EdgeInsets.all(10),
              child: Container(
                color: Color.fromARGB(100, 200, 50, 0),
              ),
            ),
          )
        ],
      ),
    );
  }
}
上一篇下一篇

猜你喜欢

热点阅读