Размер виджета флаттера зависит от другого - PullRequest
1 голос
/ 08 марта 2019

Я сейчас пытаюсь сделать пользовательский виджет во флаттере.Простая прокрутка "от А до Я" справа от списка элементов для перехода по индексам.Моя проблема в том, что на самом деле мне нужно использовать размер виджета списка, чтобы определить размер шрифта для букв.

Для иллюстрации: enter image description here

Я добавил список как дочерний элемент пользовательского класса, чтобы получить его высоту из контекста.Я попытался получить размер с помощью 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; 

            }

          });
        },
      )
    ]);
  }

}

Есть ли способ инициировать мой «размер шрифта текста виджета» в зависимости от"высота размера списка"?

Большое спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Виджет не может зависеть от размера другого виджета.С другой стороны, это может зависеть от ограничений .

Для этого вы можете использовать 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 голосов
/ 08 марта 2019

Вы можете вывести размер 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 ;

Размеры ваших писем должны быть меньше указанного выше, чтобы обеспечить некоторый интервал между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...