Flutter 同一类中的单独函数不起作用

Flutter 同一类中的单独函数不起作用,flutter,dart,Flutter,Dart,我试着减少和增加这个数字,效果很好。这里的问题是,当我为我的onTapDown函数创建一个单独的函数时,的数字减量不起作用。我在这里犯了什么错误吗?但当我把它放在我的onTap函数中时,它就像add INCO中的函数一样工作良好 import 'dart:async'; import 'package:flutter/material.dart'; class Container1 extends StatefulWidget { @override _Container1State

我试着减少和增加这个数字,效果很好。这里的问题是,当我为我的onTapDown函数创建一个单独的函数时,的数字减量不起作用。我在这里犯了什么错误吗?但当我把它放在我的onTap函数中时,它就像add INCO中的函数一样工作良好

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

class Container1 extends StatefulWidget {
  @override
  _Container1State createState() => _Container1State();
}

class _Container1State extends State<Container1> {
  int num = 20;
  Timer timer;
  void minusOnTapDown(int parameter) {
    timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
      setState(() {
        parameter--;
        if (parameter <= 1) {
          timer.cancel();
          parameter = 1;
        }
      });
    });
  }

  void plusOnTapDown(int parameter) {
    timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
      setState(() {
        parameter--;
        if (parameter <= 0) {
          timer.cancel();
        }
      });
    });
  }

  void cancelTimer(int parameter) {
    setState(() {
      timer.cancel();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '$num',
            style: TextStyle(fontSize: 30.0),
          ),
          SizedBox(
            height: 50.0,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              GestureDetector(
                onTapDown: (TapDownDetails details) {
                  minusOnTapDown(num);
                },
                onTapUp: (TapUpDetails details) {
                  cancelTimer(num);
                },
                onTapCancel: () {
                  cancelTimer(num);
                },
                child: Container(
                  height: 50.0,
                  width: 50.0,
                  color: Colors.grey,
                  child: Icon(Icons.minimize),
                ),
              ),
              SizedBox(
                width: 50.0,
              ),
              GestureDetector(
                onTapDown: (TapDownDetails details) {
                  print('Down');
                  timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
                    setState(() {
                      num++;
                    });
                  });
                },
                onTapUp: (TapUpDetails details) {
                  setState(() {
                    print('Up');
                    timer.cancel();
                  });
                },
                onTapCancel: () {
                  print('Cancel');
                  timer.cancel();
                },
                child: Container(
                  height: 50.0,
                  width: 50.0,
                  color: Colors.grey,
                  child: Icon(Icons.add),
                ),
              ),
            ],
          )
        ],
      ),
    );
  }
}

导入'dart:async';
进口“包装:颤振/材料.省道”;
类Container1扩展了StatefulWidget{
@凌驾
_Container1State createState()=>\u Container1State();
}
类_Container1State扩展状态{
int num=20;
定时器;
void minusOnTapDown(int参数){
计时器=计时器。周期性(持续时间(毫秒:100),(计时器){
设置状态(){
参数--;

如果(parameter这是因为当您创建单独的方法时,您正在传递一个名为
parameter
的参数,并增加或减少该参数。而反映在UI中的变量
num
变量完全不受影响。因此,在单独的方法中,您也需要增加或减少
num
变量直接。并且不需要传递
参数

  void minusOnTapDown() {
    timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
      setState(() {
        num--;
        if (num <= 1) {
          timer.cancel();
          num = 1;
        }
      });
    });
  }

这是因为当您创建单独的方法时,您正在传递一个名为
parameter
的参数,并增加或减少该参数。而反映在UI中的变量
num
变量完全不受影响。因此,在单独的方法中,您也需要直接增加或减少
num
变量。并且不需要传递
参数

  void minusOnTapDown() {
    timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
      setState(() {
        num--;
        if (num <= 1) {
          timer.cancel();
          num = 1;
        }
      });
    });
  }

我认为出现错误是因为您试图减少参数而不是实际的num。参数——不会反映num

可以这样称呼:

onTapDown: (TapDownDetails details) {
              minusOnTapDown();
            },
onTapUp: (TapUpDetails details) {
              cancelTimer();
并对功能进行更改:

void minusOnTapDown() {
timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
  setState(() {
    num--;
    if (num<= 1) {
      timer.cancel();
      num= 1;
    }
  });
});
}
void minusOnTapDown(){
计时器=计时器。周期性(持续时间(毫秒:100),(计时器){
设置状态(){
num--;

如果(num我认为发生错误是因为您试图减少参数而不是实际的num.parameter——不会反映num

可以这样称呼:

onTapDown: (TapDownDetails details) {
              minusOnTapDown();
            },
onTapUp: (TapUpDetails details) {
              cancelTimer();
并对功能进行更改:

void minusOnTapDown() {
timer = Timer.periodic(Duration(milliseconds: 100), (timer) {
  setState(() {
    num--;
    if (num<= 1) {
      timer.cancel();
      num= 1;
    }
  });
});
}
void minusOnTapDown(){
计时器=计时器。周期性(持续时间(毫秒:100),(计时器){
设置状态(){
num--;

如果(num当我有多个参数(如年龄和体重)时,我能做什么?在这种情况下,我该怎么做?你可以将大小写字符串作为参数传递到方法中。并根据它是否是年龄、体重等。在方法中切换大小写,并相应地增加/减少相应的变量。@Arud抱歉,我不明白你的意思。“我应该?当我有多个参数(如年龄和体重)时,我该怎么办?在这种情况下,我该怎么办?您可以将大小写字符串作为参数传递到方法中。并根据它是否是年龄、体重等。在方法中切换大小写,并相应地增加/减少相应的变量。@Arud抱歉,我不理解您的意思。“我应该这样做…”?只是为了补充已经提供的答案。虽然dart中的所有内容都是对象,因此也是原语,但在实践中,它将显示的行为就像是通过值传递的一样。(我不太确定为什么,但我在堆栈溢出中看到了一个很好的解释)。除非传递类的实例,否则只会更改保存在函数参数内的复制值。只需添加已提供的答案即可。虽然dart中的所有内容都是对象,因此也是原语,但在实践中,它将显示的行为就像是通过值传递一样。(我不太清楚为什么,但我在Stack Overflow中看到了一个很好的解释)。除非传递类的实例,否则只会更改函数参数内的复制值。当我有多个参数(如年龄和体重)时,我该怎么办?在这种情况下,我该怎么办?当我有多个参数(如年龄和体重)时,我该怎么办?在这种情况下,我该怎么办?