如何使计数器在后台使用异步倍数

时间:2019-10-25 18:44:47

标签: flutter dart

我正在尝试制作类似答题器的应用程序来测试自己。一切都很完美,直到我开始异步处理。我想做的是一个程序,将自己乘以门牌号。像用户一样,如果用户有2个房屋,则用户应每秒获得2点积分。我阅读了dart的原始文档,并从那里复制了它。

代码:

import 'dart:async';

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Zikirmatik'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  int _max = 0;
  int _ev = 0;
  int _toplanan = 0;


  void _incrementCounter() {// Eklemeler sürekli tekrar çağrıldığı için bunları ayrı bir voide almamız gerek
    setState(() { //Tekrar çağrılmasını sağlayan komut
      _counter++;
    });
  }
  void _decreaseCounter(){
    setState(() {
      _counter--;
    });
  }
  void _resetCounter(){
    setState(() {
     _counter = 0; 
    });
  }
  void _evArttiran(){
    setState(() {
     _ev++; 
    });
  }
  void _otoArttiran(){
    setState(() {
      _toplanan = _ev * 1;
    });
  }

  @override
  Widget build(BuildContext context) {
    if(_counter > _max){ //Yüksek skor if'i
      _max = _counter;
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Skor:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1, // Anlık skoru kalın göstern
            ),
            Text(
              'Yüksek Skor:',
            ),
            Text(
              '$_max',
            ),
            Text(
              'Ev Sayısı:',
            ),
            Text(
              '$_ev',
            ),
            OutlineButton( // Büyük button
              onPressed: () => _incrementCounter(),   // Ayrı bi void yazmamak için fat işaret kullanıyoruz          
              child: Container(
                width: 1000, // Ayarlamazsanız küçük oluyor
                height: 500,
                child: Icon(Icons.add, size:100)               
              )
            )
          ],          
        ),
      ),  

      floatingActionButton: Row( //Yan yana düğme yazmak için Row gerek
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
      FloatingActionButton( //Düz ufak butonlar
      onPressed: _evArttiran,
      child: Icon(Icons.home),
    ),
  ],
)
    );
  }
  main() async{
    Timer(Duration(seconds: 1), () {
      _otoArttiran;     
      debugPrint(_toplanan.toString());
      _counter += _toplanan;
    });
  }
}

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但是也许您可以尝试以下方法:
(在_MyHomePageState内部)

  @override
  void initState() {
    super.initState();
    Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        _counter = _counter + _ev;
      });
    });
  }

答案 1 :(得分:1)

  1. 您需要创建一个periodic计时器,并且不要忘记将()放在计时器回调中的_otoArttiran之后:
main() async{
    Timer.periodic(Duration(seconds: 1), (_) {
      _otoArttiran();
      debugPrint(_toplanan.toString());
      _counter += _toplanan;
    });
  }
  1. 您需要调用此函数以使计时器开始工作,因此让我们在initState中添加_MyHomePageState方法:
@override void initState() {
    super.initState();
    main();
  }

完成!


这是完整的代码:

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

void main() => runApp(new TheApp());

class TheApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Zikirmatik'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  int _max = 0;
  int _ev = 0;
  int _toplanan = 0;

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


  void _incrementCounter() {// Eklemeler sürekli tekrar çağrıldığı için bunları ayrı bir voide almamız gerek
    setState(() { //Tekrar çağrılmasını sağlayan komut
      _counter++;
    });
  }
  void _decreaseCounter(){
    setState(() {
      _counter--;
    });
  }
  void _resetCounter(){
    setState(() {
      _counter = 0;
    });
  }
  void _evArttiran(){
    setState(() {
      _ev++;
    });
  }
  void _otoArttiran(){
    setState(() {
      _toplanan = _ev * 1;
    });
  }

  @override
  Widget build(BuildContext context) {
    if(_counter > _max){ //Yüksek skor if'i
      _max = _counter;
    }
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Skor:',
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.display1, // Anlık skoru kalın göstern
              ),
              Text(
                'Yüksek Skor:',
              ),
              Text(
                '$_max',
              ),
              Text(
                'Ev Sayısı:',
              ),
              Text(
                '$_ev',
              ),
              OutlineButton( // Büyük button
                  onPressed: () => _incrementCounter(),   // Ayrı bi void yazmamak için fat işaret kullanıyoruz
                  child: Container(
                      width: 1000, // Ayarlamazsanız küçük oluyor
                      height: 500,
                      child: Icon(Icons.add, size:100)
                  )
              )
            ],
          ),
        ),

        floatingActionButton: Row( //Yan yana düğme yazmak için Row gerek
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FloatingActionButton( //Düz ufak butonlar
              onPressed: _evArttiran,
              child: Icon(Icons.home),
            ),
          ],
        )
    );
  }

  main() async{
    Timer.periodic(Duration(seconds: 1), (_) {
      _otoArttiran();
      debugPrint(_toplanan.toString());
      _counter += _toplanan;
    });
  }
}