Как перезапустить анимацию?

Я хотел бы реанимировать текст каждый раз, когда этот текст, иначе говоря, пользовательский текст, изменяется, или каждый раз, когда я нажимаю кнопку. Есть ли функция для того, что я мог бы вызвать с кнопки? Спасибо!

import 'package:flutter/material.dart';
import 'dart:ui';
import 'package:flutter_reactive_value/flutter_reactive_value.dart';

var customtext = ReactiveValueNotifier<String>('from clear to blurred');

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                TweenAnimationBuilder<double>(
                  tween: Tween<double>(begin: 0, end: 10),
                  duration: Duration(milliseconds: 15000),
                  builder: (_, value, __) {
                    return ImageFiltered(
                      imageFilter: ImageFilter.blur(
                        sigmaX: value,
                        sigmaY: value,
                      ),
                      child: Text('${customtext.reactiveValue(context)}',
                          style: TextStyle(fontSize: 18)),
                    );
                  },
                ),
                OutlinedButton(
                    onPressed: () {
                      customtext.value = 'again';
                    },
                    child: Text('new value', style: TextStyle(fontSize: 14))),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Я нашел этот контроллер анимации https://api.flutter.dev/flutter/animation/AnimationController-class.html но не знаю, что добавить в vsync, а также не знаю, решит ли это мою проблему или нет.

редактировать:

Стараюсь, стараюсь... :) Теперь, когда я нажимаю кнопку, я получаю следующее: «LateInitializationError: поле '_controller@18499174' не было инициализировано. ". Мой код сейчас выглядит так:

import 'package:flutter/material.dart';
import 'dart:ui';
import 'package:flutter_reactive_value/flutter_reactive_value.dart';

var customtext = ReactiveValueNotifier<String>('from clear to blurred');

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                AnimationThingy(),
                OutlinedButton(
                    onPressed: () {
                      customtext.value = 'again';
                      _AnimationThingyState()._controller.reset();
                    },
                    child: Text('new value', style: TextStyle(fontSize: 14))),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class AnimationThingy extends StatefulWidget {
  const AnimationThingy({super.key});

  @override
  State<StatefulWidget> createState() => _AnimationThingyState();
}

class _AnimationThingyState extends State<AnimationThingy> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this, duration: Duration(milliseconds: 500));
  }

  @override
  Widget build(BuildContext context) {
    return TweenAnimationBuilder<double>(
      tween: Tween<double>(begin: 0, end: 8),
      duration: Duration(milliseconds: 5000),
      builder: (_, value, __) {
        return ImageFiltered(
          imageFilter: ImageFilter.blur(
            sigmaX: value,
            sigmaY: value,
          ),
          child: Text('${customtext.reactiveValue(context)}',
              style: TextStyle(fontSize: 18)),
        );
      },
    );
  }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
import 'dart:math';

import 'package:flutter/material.dart';
import 'dart:ui';
import 'package:flutter_reactive_value/flutter_reactive_value.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyPageWidget(),
    );
  }
}

final customtext = ReactiveValueNotifier<String>('from clear to blurred');

class MyPageWidget extends StatefulWidget {
  const MyPageWidget({super.key});
  @override
  State<MyPageWidget> createState() => _MyPageWidgetState();
}

class _MyPageWidgetState extends State<MyPageWidget> {
  final _random = Random();
  final _listStrings = <String>[
    'first',
    'second',
    'Third',
    'Fourth',
    'Fifth',
  ];

  void _onChange() {
    customtext.value = _listStrings[_random.nextInt(_listStrings.length)];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              AnimationThingy(text: customtext.reactiveValue(context)),
              OutlinedButton(
                  onPressed: _onChange,
                  child:
                      const Text('new value', style: TextStyle(fontSize: 14))),
            ],
          ),
        ),
      ),
    );
  }
}

class AnimationThingy extends StatefulWidget {
  const AnimationThingy({super.key, required this.text});
  final String text;
  @override
  State<StatefulWidget> createState() => _AnimationThingyState();
}

class _AnimationThingyState extends State<AnimationThingy>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;
  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
        vsync: this,
        duration: const Duration(milliseconds: 15000));
    _animation = Tween<double>(begin: 0, end: 8).animate(_controller);
    _onAnimate();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  void didUpdateWidget(covariant AnimationThingy oldWidget) {
    if (widget.text != oldWidget.text) {
      _onAnimate();
    }
    super.didUpdateWidget(oldWidget);
  }

  void _onAnimate() async {
    if (_controller.isDismissed) {
      await _controller.forward();
    } else {
      _controller.reset();
      await _controller.forward();
    }
  }
  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _controller.view,
      builder: (_, __) {
        return ImageFiltered(
          imageFilter: ImageFilter.blur(
            sigmaX: _animation.value,
            sigmaY: _animation.value,
          ),
          child: Text(widget.text, style: const TextStyle(fontSize: 18)),
        );
      },
    );
  }
}

Большое спасибо! Но у меня проблема с тем, что он показывает текст без размытия ни на секунду.

My Name 13.04.2024 21:14

@MyName Я не понял. Хотите, чтобы размытие длилось несколько секунд?

Chance 13.04.2024 21:19

Не обращайте внимания на мой предыдущий комментарий .. (: Итак, мои проблемы: первый текст не анимируется. Анимация должна идти только в одном направлении, а не вперед и назад. Если кнопка будет нажата до окончания анимации, приложение будет заморозить.

My Name 13.04.2024 22:39

Другие вопросы по теме