в GestureDetector не вижу разницы между onScaleStart и onTap

В GestureDetector не вижу разницы между onScaleStart и onTap. Если я синий квадрат двумя пальцами развожу в стороны, то теоретически, квадрат должен вслед за пальцами изменять ширину, а он, синий квадрат, изменяет ширину, так же, как и при клике. Почему? Я закоментировал onTap. Если расскоментировать его и закоментировать onScaleStart разницы не будет ни какой. Далее полный код.

main.dart

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  return MaterialApp(
   debugShowCheckedModeBanner: false,
   title: 'Name App',
   theme: ThemeData(
    primarySwatch: Colors.blue,
   ),
   home: Scaffold(
    appBar: AppBar(
     title: Text('Name Page'),
    ),
    body: MyHomePage(),
   ),
  );
 }
}

class MyHomePage extends StatefulWidget {
 @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

 String _str;
 double _width;
 double _height;
 bool _b;

 @override
 void initState() {
  super.initState();
  _str = '0';
  _width = 100.0;
  _height = 100.0;
  _b = false;
 }

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

 }

 void _f1() {
  setState(() {

  });
 }

 @override
 Widget build(BuildContext context) {
  return Stack(
   children: [
    Align(
     alignment: Alignment(0.0, -0.95),
     child: GestureDetector(

      /*onTap: () {
       setState(() {
        if(_b) {
         _b = false;
         _width = 100.0;
         _str = '2';
        } else {
         _b = true;
         _width = MediaQuery.of(context).size.width / 1.2;
         _str = '1';
        }
       });
      },*/

      onScaleStart: (ScaleStartDetails details) {
       setState(() {
        if(_b) {
         _b = false;
         _width = 100.0;
         _str = '2';
        } else {
         _b = true;
         _width = MediaQuery.of(context).size.width / 1.2;
         _str = '1';
        }
       });
      },

      child: Container(
       //width: 100.0,
       //height: 100.0,
       width: _width,
       height: _height,
       color: Colors.indigoAccent,
      ),
     ),
    ),
    Align(
     alignment: Alignment.center,
     child: Text(
      _str,
      style: TextStyle(
       fontSize: 36.0,
       color: Colors.pink
      ),
     ),
    ),
   ],
  );
 }

}

Ответы (1 шт):

Автор решения: MiT

Перенос ответа из комментариев, чтобы закрыть вопрос.

onScaleStart срабатывает при старте изменения масштаба (scale > 1), вам же нужно использовать onScaleUpdate.

GestureDetector(
  onScaleUpdate: (ScaleStartDetails details) {
    setState(() {
      if(_b) {
        _b = false;
        _width = 100.0;
        _str = '2';
      } else {
        _b = true;
        _width = MediaQuery.of(context).size.width / 1.2;
        _str = '1';
      }
    });
  },
  ...
)
→ Ссылка