颤动的小部件大小取决于另一个

问题描述 投票:1回答:2

我正在尝试制作一个自定义小部件。在要跳转索引的元素列表右侧的简单“A到Z滚动条”。我的问题是,实际上我需要使用列表小部件的大小来确定字母的字体大小。

举例说明:enter image description here

我将列表添加为自定义类的子级,以使其从上下文中获得高度。我尝试在“build”方法中使用context.size.heigth获取大小,但是我得到了一个错误,因为小部件不是构建的。然后我试着执行像我在这里读到的异步方法:Stack overflow post

我可以在没有错误的情况下获得context.size.height的唯一位置是我的手势检测器的onVerticalDragUpdate。

有我的实际代码:

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {  
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: new AtoZSlider(child: _builList()),
    );
  }
}

Widget _builList() { //test list
  return ListView.builder(
    padding: EdgeInsets.all(8.0),
    itemExtent: 20.0,
    itemCount: 1000,
    itemBuilder: (BuildContext context, int index) {
      return Text('entry $index');
    },
  );
}

class AtoZSlider extends StatefulWidget {
  final Widget child;

  AtoZSlider({this.child});

  @override
  _AtoZSlider createState() => new _AtoZSlider();
}

class _AtoZSlider extends State<AtoZSlider> {
  double _offsetContainer;
  double _heightscroller;
  bool _isHeightSetup;
  var _text;
  var _alphabet;

  @override
  void initState() {
    super.initState();
    _offsetContainer = 0.0;
    _isHeightSetup = false;
    _heightscroller = 14.0; //default value that i want to calculate with context size
    _alphabet = [
      '#',
      'A',
      'B',
      'C',
      'D',
      'E',
      'F',
      'G',
      'H',
      'I',
      'J',
      'K',
      'L',
      'M',
      'N',
      'O',
      'P',
      'Q',
      'R',
      'S',
      'T',
      'U',
      'V',
      'W',
      'X',
      'Y',
      'Z'
    ];
    _text = _alphabet[0];
  }

  @override
  Widget build(BuildContext context) {
    return  Stack(alignment: Alignment.topRight, children: [
      widget.child,
      GestureDetector(
        child: Container(
            child: Text(_text, style: new TextStyle(fontSize: _heightscroller),),
            height: _heightscroller,
            margin: EdgeInsets.only(top: _offsetContainer)),
        onVerticalDragUpdate: (DragUpdateDetails details) {
          setState(() {

            if ((_offsetContainer + details.delta.dy) >= 0 &&
                (_offsetContainer + details.delta.dy) <=
                    (context.size.height - _heightscroller)) { // to move my scroller on the vertical axis and not out of band using context.size.height
              _offsetContainer += details.delta.dy; 

            }

          });
        },
      )
    ]);
  }

}

有没有办法根据“列表大小高度”初始化我的“小部件文本字体大小”?

非常感谢您提供任何帮助。

build flutter widget size
2个回答
2
投票

窗口小部件不能依赖于另一个窗口小部件的大小。另一方面,它可以取决于约束。

为此,您可以使用LayoutBuilder来获取约束并相应地构建小部件:

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text("Hello World")),
    body: LayoutBuilder(
      builder: (context, constraints) {
        if (constraints.biggest.width > 100) {
          return Text('Hello');
        }
        return Container();
      },
    ),
  );
}

0
投票

您可以通过减去Listviewheight为总屏幕AppBar推断出height大小。您可以通过在分配之前定义它来获得AppBar高度:

   class _MyHomePageState extends State<MyHomePage> {

   AppBar myBar = AppBar(title: Text(widget.title),);

   @override
   Widget build(BuildContext context) {  
      return Scaffold(
        appBar: myBar,
      )

然后你的Listview高度将是:

  var _listHeight = MediaQuery.of(context).size.height - myBar.prefferedSize.height ;

每个字母大小将是:

  var _letterHeight = height/27 ;

您应该使字母的尺寸小于上述尺寸,以便在它们之间留出一些间距。

© www.soinside.com 2019 - 2024. All rights reserved.