如何使我的整个Flutter应用只能注册一次触摸?

问题描述 投票:1回答:1

我正在制作一个应用程序,但我希望整个应用程序只能接收一次触摸。例如,如果该应用程序有2个可拖动容器,则我只希望一个容器可拖动,因为我希望整个应用程序一次只注册1次触摸。这可能吗?

这里有一些代码(简体),有人可以向我展示如何使用这个简单的示例代码吗?因此,我可以弄清楚如何使用更复杂的代码来做到这一点?谢谢!

import 'package:flutter/material.dart';

class MyTest extends StatefulWidget {
  @override
  _MyTestState createState() => _MyTestState();
}

class _MyTestState extends State<MyTest> {

  int myTestInt = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.indigo,
      body: Center(
        child: Column(
          children: <Widget>[
            Text('test'),
            Text('test'),
            Text('$myTestInt'),
          ],
        ),
      ),
    );
  }
}

这是我为您提供解决方案的尝试(可能是错误的,抱歉,我对此很陌生:):

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

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  bool isPressed = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.indigoAccent,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          InkWell(
            onLongPress: () {
              if (isPressed == false) {
                setState(() {
                  isPressed = true;
                });
              }
            },
            child:  Container(
              child: Padding(
                padding: EdgeInsets.all(30),
                child: Center(
                  child:
                  DragTarget<dynamic>(builder: (context, accepted, rejected) {
                    return Draggable(
                      maxSimultaneousDrags: 1,
                      child: Container(
                        height: 50,
                        width: 50,
                        color: Colors.pink,
                      ),
                      feedback: Container(
                        height: 50,
                        width: 50,
                        color: Colors.pink,
                      ),
                      childWhenDragging: Container(
                        height: 50,
                        width: 50,
                        color: Colors.yellowAccent,
                      ),
                    );
                  }),
                ),
              ),
            ),
          ),
          InkWell(
            onLongPress: () {
              if (isPressed == false) {
                setState(() {
                  isPressed = true;
                });
              }
            },
            child:  Container(
              child: Padding(
                padding: EdgeInsets.all(30),
                child: Center(
                  child:
                  DragTarget<dynamic>(builder: (context, accepted, rejected) {
                    return Draggable(
                      maxSimultaneousDrags: 1,
                      child: Container(
                        height: 50,
                        width: 50,
                        color: Colors.pink,
                      ),
                      feedback: Container(
                        height: 50,
                        width: 50,
                        color: Colors.pink,
                      ),
                      childWhenDragging: Container(
                        height: 50,
                        width: 50,
                        color: Colors.yellowAccent,
                      ),
                    );
                  }),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

新代码的另一次更新:main.dart:

import 'package:flutter/material.dart';
import 'package:flutterdragtest/home_screen.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays ([]);
    SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

home_screen.dart:

import 'package:flutter/material.dart';
import 'my_widget.dart';
import 'my_class.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

void reload() {
  print('Reload');
  setState(() {});
}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.indigoAccent,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          MyWidget(id: 1, reload: reload,),
          MyWidget(id: 2, reload: reload,),
          MyWidget(id: 3, reload: reload,),
        ],
      ),
    );
  }
}

my_widget.dart :(我知道这是超级糟糕的代码,但它只是测试中)

import 'package:flutter/material.dart';
import 'package:flutterdragtest/my_class.dart';

class MyWidget extends StatefulWidget {

  final int id;

  final Function reload;

  MyWidget({@required this.id, @required this.reload});

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

class _MyWidgetState extends State<MyWidget> {

  bool whichAbsorb() {
    switch (widget.id) {
      case 1: {
        return CircleData.dk1;
      }
      break;
      case 2: {
        return CircleData.dk2;
      }
      break;
      case 3: {
        return CircleData.dk3;
      }
      break;
    }
  }

  void setAbsorb() {
    switch (widget.id) {
      case 1: {
        setState(() {
          CircleData.dk1 = false;
          CircleData.dk2 = true;
          CircleData.dk3 = true;
        });
      }
      break;
      case 2: {
        setState(() {
          CircleData.dk1 = true;
          CircleData.dk2 = false;
          CircleData.dk3 = true;
        });
      }
      break;
      case 3: {
        setState(() {
          CircleData.dk1 = true;
          CircleData.dk2 = true;
          CircleData.dk3 = false;
        });
      }
      break;
    }
  }

  void clearAbsorb() {
    setState(() {
      CircleData.dk1 = false;
      CircleData.dk2 = false;
      CircleData.dk3 = false;
    });
  }

  bool blockCheck() {
    switch (widget.id) {
      case 1: {
        if (CircleData.dk1 == false) {
          return true;
        }
        else {
          return false;
        }
      }
      break;
      case 2: {
        if (CircleData.dk2 == false) {
          return true;
        }
        else {
          return false;
        }
      }
      break;
      case 3: {
        if (CircleData.dk3 == false) {
          return true;
        }
        else {
          return false;
        }
      }
      break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return AbsorbPointer(
      absorbing: whichAbsorb(),
      child: Padding(
        padding: EdgeInsets.all(40),
        child: Center(
          child: DragTarget<dynamic>(
              builder: (context, accepted, rejected){
                if (blockCheck()) {
                  return GestureDetector(
                    onTapDown: (_) {
                      setAbsorb(); widget.reload();
                    },
                    child: Draggable(
                      onDragStarted: () {setAbsorb(); widget.reload();},
                      onDragCompleted: () {clearAbsorb(); widget.reload();},
                      onDraggableCanceled: (e, q) {clearAbsorb(); widget.reload();},
                      maxSimultaneousDrags: 1,
                      child: Container(height: 50, width: 50, color: Colors.pink,),
                      feedback: Container(height: 50, width: 50, color: Colors.pink,),
                      childWhenDragging: Container(height: 50, width: 50, color: Colors.yellowAccent,),
                    ),
                  );
                }
                else {
                  return Container(height: 50, width: 50, color: Colors.green,);
                }
              }
          ),
        ),
      ),
    );
  }
}

my_class.dart:

class CircleData {

  static int num;

  static bool dk1 = false;
  static bool dk2 = false;
  static bool dk3 = false;

}
flutter dart draggable
1个回答
0
投票

用墨水瓶包装每个容器并添加一个布尔值将达到目的。

首先在Widget Build顶部添加布尔值:

bool isPressed=false;

尝试一下:

InkWell(
 onLongPress: () {
   if(isPressed==false){
     setState(() {
      isPressed=true;
     });
     //do something
   }
 }
)

您也可以用GestureDetector包裹它。但是,每次单击该容器都不会产生任何动画。

GestureDetector(
 onLongPress: () {
  if(isPressed==false){
     setState(() {
      isPressed=true;
     });
     //do something
  },
 }
)

我还建议在创建每个容器时使用ListView.builder,而不是手动一个个地输入它们。示例:

首先在Widget Build方法上方生成一个数组:

final items = List<String>.generate(100, (i) => "Item $i");

将其放置在脚手架内或容器内:

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile( //you can change this to a container
      title: Text('${items[index]}'),
    );
  },
);
© www.soinside.com 2019 - 2024. All rights reserved.