#flutter #flutter-animation
Вопрос:
Допустим, у меня есть эта стопка:
Stack(
children: [
Column( // ==> I want to apply tranform (more specifically translate) on this
children: [
// a whole bunch of widgets
],
),
Column( // ==> and this
children: [
// a whole bunch of widgets
],
),
],
);
В стеке есть две колонки, и в каждой колонке есть огромное дерево детей внутри.
Что я хочу сделать, так это переместить столбцы на экране в определенные состояния.
Один из способов добиться этого-обернуть каждый столбец в an AnimatedBuilder
, но это означало бы, что в каждом кадре потребуется воссоздать все дерево виджетов, что не идеально.
В родном Android есть этот метод, который делает то, что мне нужно:
someView.animate().translateX(100).withLayer();
Есть ли эквивалент этому в flutter или какой-либо другой способ достичь этого?
Комментарии:
1.
AnimatedBuilder
имеетchild
собственность2. @pskink я не понимаю. Не могли бы вы уточнить?
3. проверьте официальную документацию по
AnimatedBuilder.child
собственности (и поAnimatedBuilder
классу тоже).4. Хорошо, я понял, спасибо. Я не знаю, как я это пропустил!
Ответ №1:
Благодаря @pskink, вот как это делается:
Stack(
children: [
AnimatedBuilder(
animation: _animation,
builder: (context, child) {
return Transform.translate(
offset: Offset(_animation.value, 0),
child: child,
);
},
child: Column(
children: [
// a whole bunch of widgets
],
),
),
...
],
);
Виджет , который необходимо изменить, чтобы произошло преобразование, таков Transform.translate
, поэтому я поместил его в builder
класс, а остальную часть дерева, на которую он не должен влиять, я поместил в свойство AnimatedBuilder
«s child
«.
Затем дочерний элемент передается обратно в builder
метод, где я могу просто передать его дочернему свойству того, что находится внутри метода builder, и он не будет перестроен.