我正在尝试制作一个自定义小部件。在要跳转索引的元素列表右侧的简单“A到Z滚动条”。我的问题是,实际上我需要使用列表小部件的大小来确定字母的字体大小。
我将列表添加为自定义类的子级,以使其从上下文中获得高度。我尝试在“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;
}
});
},
)
]);
}
}
有没有办法根据“列表大小高度”初始化我的“小部件文本字体大小”?
非常感谢您提供任何帮助。
窗口小部件不能依赖于另一个窗口小部件的大小。另一方面,它可以取决于约束。
为此,您可以使用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();
},
),
);
}
您可以通过减去Listview
的height
为总屏幕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 ;
您应该使字母的尺寸小于上述尺寸,以便在它们之间留出一些间距。