Я сейчас пытаюсь сделать пользовательский виджет во флаттере.Простая прокрутка "от А до Я" справа от списка элементов для перехода по индексам.Моя проблема в том, что на самом деле мне нужно использовать размер виджета списка, чтобы определить размер шрифта для букв.
Для иллюстрации:
Я добавил список как дочерний элемент пользовательского класса, чтобы получить его высоту из контекста.Я попытался получить размер с помощью context.size.heigth в методе "build", но я получил ошибку, потому что виджет не является сборкой.Затем я попытался выполнить асинхронный метод, как я прочитал здесь: Сообщение о переполнении стека
Единственное место, где я могу получить 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;
}
});
},
)
]);
}
}
Есть ли способ инициировать мой «размер шрифта текста виджета» в зависимости от"высота размера списка"?
Большое спасибо за любую помощь.