Запустить функцию из другого виджета - PullRequest
0 голосов
/ 19 апреля 2020

Эй, ребята, у меня есть (надеюсь, для вас простая) проблема. Как я могу запустить функцию из другого виджета? У меня есть StatelessWidget, откуда я хочу запустить функцию таймера, которая находится в StatefulWidget. Как я могу запустить таймер (который «есть» в statefulWidget) из statelessWidget? Я надеюсь, что вы понимаете мою проблему, если не скажите мне, пожалуйста, какие части кода вам нужны. Заранее спасибо!

[...]

void main() => runApp(
      MaterialApp(
        home: Workout1(),
        routes: { "/home": (context) => Homescreen(),}
      ),
    );

class Workout1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Title"),
        ),
        body: BodyConstruction());
  } 
}

class BodyConstruction extends StatefulWidget {
  @override
  _BodyConstructionState createState() =>
      _BodyConstructionState(); //the belongs to a "StatefulWidget"
}

class _BodyConstructionState extends State<BodyConstruction> {
  int _time = 10;

[...]

  void countdown() {
    Timer.periodic(
      Duration(seconds: 1),
      (timer) {
        setState(() {
          _time--; //every second -1
        });



 @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        children: <Widget>[
          [...]




            RaisedButton(
              child: Text("Button"),
              onPressed: () {
                countdown(); //when tis button is pressed "countdown" is called
              }),
          Text(_time.toString()),
        ],
      ),
    );
  }
}

Вот код. Я надеюсь, что не буду удалять что-нибудь важное для вас, но в противном случае код был бы слишком длинным. Я хочу, чтобы таймер запускался при открытии этого экрана, а не при нажатии кнопки

1 Ответ

0 голосов
/ 19 апреля 2020

Если в вашем виджете с состоянием у вас есть такая функция:

void myFunction() {
    // Do something!
}

и там, где вы включили виджет без состояния, передайте ссылку на функцию в его конструктор.

MyStatelessWidget(myFunction)

В виджете без сохранения состояния:

class MyStatelessWidget extends StatelessWidget {
    Function timerFunction;

    MyStatelessWidget(this.timerFunction);
}

Теперь вы можете просто вызывать эту функцию в любое время, например, как при нажатии кнопки.

FlatButton(
    child: Text('Start'),
    onPressed: timerFunction,
)
...