отдельная функция внутри того же класса не работает

#flutter #dart

#flutter #dart

Вопрос:

Я пытаюсь уменьшать и увеличивать число, и это работает хорошо. Здесь вопрос в том, что когда я создаю отдельную функцию для моей функции onTapDown, уменьшение числа не работает. Допустил ли я здесь какую-либо ошибку? Но когда я помещаю это в свою функцию onTap, она работает точно так же, как функция в add incon.

 import 'dart:async';
import 'packa&e:flutter/material.dart';

class Container1 extends StatefulWid&et {
  @override
  _Container1State createState() =&&t; _Container1State();
}

class _Container1State extends State<Container1&&t; {
  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
  Wid&et build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAli&nment: MainAxisAli&nment.center,
        children: <Wid&et&&t;[
          Text(
            '$num',
            style: TextStyle(fontSize: 30.0),
          ),
          SizedBox(
            hei&ht: 50.0,
          ),
          Row(
            mainAxisAli&nment: MainAxisAli&nment.center,
            children: <Wid&et&&t;[
              GestureDetector(
                onTapDown: (TapDownDetails details) {
                  minusOnTapDown(num);
                },
                onTapUp: (TapUpDetails details) {
                  cancelTimer(num);
                },
                onTapCancel: () {
                  cancelTimer(num);
                },
                child: Container(
                  hei&ht: 50.0,
                  width: 50.0,
                  color: Colors.&rey,
                  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(
                  hei&ht: 50.0,
                  width: 50.0,
                  color: Colors.&rey,
                  child: Icon(Icons.add),
                ),
              ),
            ],
          )
        ],
      ),
    );
  }
}

  

Комментарии:

1. Просто чтобы добавить к предоставленным ответам. Хотя все в dart является объектом и, следовательно, примитивами тоже, на практике поведение, которое он будет демонстрировать, такое, как если бы оно было передано по значению. (Я не слишком уверен, почему, но я видел хорошее объяснение в Stack Overflow). Если вы не передаете, скажем, экземпляр класса, вы измените только скопированное значение, которое находится внутри параметра функции.

Ответ №1:

Я думаю, ошибка возникает из-за того, что вы пытаетесь уменьшить параметр вместо фактического числа. параметр — не будет отражаться на 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;
    }
  });
});
}
  

Надеюсь, это сработает!

Комментарии:

1. Что я могу сделать, если у меня есть более одного параметра, такого как возраст и вес? Что мне делать в этом случае?

Ответ №2:

Это потому, что при создании отдельного метода вы передаете параметр с именем parameter и увеличиваете или уменьшаете его. В то время как num переменная, которая является переменной, отражающейся в пользовательском интерфейсе, полностью не затронута. Таким образом, и в отдельном методе вам нужно напрямую увеличивать или уменьшать num переменную. И нет необходимости передавать parameter .

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

И вызовите ее в onTapDown обратном вызове.

 onTapDown: (TapDownDetails details) {
                  minusOnTapDown();
                },
  

Комментарии:

1.Что я могу сделать, если у меня есть более одного параметра, такого как возраст и вес? Что мне делать в этом случае?

2. Вы можете передать строку case в качестве параметра в методе. И в зависимости от того, является ли это возрастом, весом и т.д. переключайте регистры внутри метода и соответственно увеличивайте / уменьшайте соответствующую переменную.

3. @Arud извините, я не понял, что вы имеете в виду. «Я должен это ….» ??