Flutter小部件的大小取决于另一个小部件

31 浏览
0 Comments

Flutter小部件的大小取决于另一个小部件

我目前正在尝试在Flutter中创建一个自定义小部件。

在元素列表的右侧添加一个简单的“A到Z滚动器”,以便跳转到索引位置。

我的问题是,实际上我需要使用列表小部件的大小来确定字母的字体大小。

示例如下:

我将列表作为子项添加到自定义类中,以从上下文中获取其高度。我尝试在“build”方法中使用context.size.height来获取大小,但是由于小部件尚未构建,所以出现错误。然后,我尝试执行一个异步方法,就像我在这里阅读到的一样。唯一可以在没有错误的情况下获取context.size.height的位置是在手势检测器的onVerticalDragUpdate中。

这是我的实际代码:

class _MyHomePageState extends State {

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text(widget.title),

),

body: new AtoZSlider(child: _buildList()),

);

}

}

Widget _buildList() { //测试列表

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 {

double _offsetContainer;

double _heightScroller;

bool _isHeightSetup;

var _text;

var _alphabet;

@override

void initState() {

super.initState();

_offsetContainer = 0.0;

_isHeightSetup = false;

_heightScroller = 14.0; //我想用上下文大小计算的默认值

_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)) { //通过使用context.size.height在垂直轴上移动我的滚动器,而不超出范围

_offsetContainer += details.delta.dy;

}

});

},

)

]);

}

}

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

非常感谢任何形式的帮助。

0
0 Comments

问题的原因是Flutter中的widget不能依赖于另一个widget的大小,但是可以依赖于constraints(约束)。为了解决这个问题,可以使用LayoutBuilder来获取约束,并根据约束构建widget。

在上述代码中,通过使用LayoutBuilder,可以根据constraints的大小来构建widget。如果constraints的宽度大于100,就返回一个Text('Hello'),否则返回一个Container()。

有人提出了一个问题,希望能让列表填充一个容器,并且获取列表的高度。可以通过使用constraints来实现这一点。在LayoutBuilder中,constraints.biggest表示整个body的大小,可以根据这个大小来设置列表的高度。

另外,还可以使用百分比来设置widget的大小,例如让一个widget占据body的一定比例等等。感谢Rémi Rousselet的提问和回答。

通过使用LayoutBuilder,可以根据约束动态地构建widget,而不是硬编码地设置大小。这样可以更好地适应不同尺寸的屏幕,实现响应式的布局。

0
0 Comments

问题的原因是需要根据另一个widget的大小来确定Flutter中的widget的大小。解决方法是通过减去AppBar的高度来推断Listview的大小,可以在赋值之前定义AppBar的高度。然后,Listview的高度将是屏幕总高度减去AppBar的高度。每个字母的大小将是总高度除以27。为了在字母之间提供一些间距,应该将字母的大小设置为小于上述大小。可以使用LayoutBuilder方法来获取body的大小,然后根据需要调整组件的大小,而不考虑AppBar。

0