Постоянный тикер во флаттере - PullRequest
0 голосов
/ 08 мая 2020

Как получить постоянную галочку при каждом обновлении кадра sh раз. Например, в игровом движке Flame метод update вызывается примерно каждые 1/60 секунды и передается значение dt с прошедшим временем.

Я хочу реализовать одну простую анимацию, в которой вентилятор будет вращаться. Я хочу изменить его скорость вращения в зависимости от ввода пользователя. Я считаю, что при каждом тике я буду вращать изображение вентилятора / контейнер на фиксированное значение. По мере того, как пользователь увеличивает скорость, я увеличиваю множитель. Есть несколько вариантов, таких как использование двигателя Flame или Flare, но они кажутся излишними. Кроме того, я могу использовать SingleTickerProviderMixin, но есть несколько накладных расходов, таких как перевернуть анимацию по завершении и перенаправить ее, и так ...

Я думаю, что будет простое решение, которое уведомит меня по адресу каждый кадр обновляется sh время, которое происходит примерно каждые 1/60 секунды, и передает мне истекшее время dt (около 167 мс или около того).

1 Ответ

1 голос
/ 08 мая 2020

Хороший способ сделать это (без виджетов анимации) - реализовать таймер с потоком; см. пример ниже:

import 'package:flutter/material.dart';
import "dart:async";

const frequency = Duration(milliseconds: 50);

void main() => runApp(
      MaterialApp(
        home: Material(
          child: Center(
            child: Container(
              color: Colors.white,
              child: MyWidget(),
            ),
          ),
        ),
      ),
    );

class MyWidget extends StatefulWidget {
  MyWidgetState createState() => MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
  final StreamController<double> _streamer =
      StreamController<double>.broadcast();

  Timer timer;

  double _rotation = 0.0;

  @override
  void initState() {
    super.initState();

    timer = Timer.periodic(frequency, (t) {
      _rotation++;
      _streamer.add(1);
    });
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<double>(
        initialData: 0,
        stream: _streamer.stream,
        builder: (context, snapshot) {
          return Transform(
            transform: Matrix4.rotationZ(_rotation),
            child: Text('Hello, World!'),
          );
        });
  }
}
...