Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了dart – 如何使用颤动在按钮网格中滑动/拖动2个或更多按钮大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用颤动制作了一个按钮网格,但现在我想在一个拖动中滑过2个或更多按钮,这样我所拖动的所有按钮都会被选中.

我已经检查了一些相同的问题,我被重定向到使用手势检测器,但这还不够.我需要某些属性或更好的示例代码,以便我能够完成它.

可拖动应用程序的一个示例是http://a5.mzstatic.com/us/r30/Purple60/v4/6f/00/35/6f0035d3-1bab-fcbb-cb13-8ab46cf3c44d/screen696x696.jpeg

解决方法

您可以手动命中测试RenderBox提取您选择的特定RenderObject.

例如,我们可以在按钮上方添加以下renderobject:

class Foo extends SingleChildRenderObjectWidget {
  final int index;

  Foo({Widget child,this.index,Key key}) : super(child: child,key: key);

  @override
  RenderObject createRenderObject(BuildContext context) {
    return _Foo()..index = index;
  }

  @override
  void updateRenderObject(BuildContext context,_Foo renderObject) {
    renderObject..index = index;
  }
}

class _Foo extends RenderProxyBox {
  int index;
}

然后使用Listener提取指针下找到的所有_Foo.

这是使用此原则的完整应用程序:

dart – 如何使用颤动在按钮网格中滑动/拖动2个或更多按钮

import 'package:Flutter/gestures.dart';
import 'package:Flutter/material.dart';
import 'package:Flutter/rendering.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: 'Flutter Demo Home Page'),);
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.titlE),),body: Grid(),);
  }
}

class Grid extends StatefulWidget {
  @override
  GridState createState() {
    return new GridState();
  }
}

class GridState extends State<Grid> {
  final Set<int> SELEctedIndexes = Set<int>();
  final key = GlobalKey();
  final Set<_Foo> _trackTaped = Set<_Foo>();

  _detectTapedItem(PointerEvent event) {
    final RenderBox Box = key.currentContext.findRenderObject();
    final result = HitTestResult();
    Offset local = Box.globalToLocal(event.position);
    if (Box.hitTest(result,position: local)) {
      for (final hit in result.path) {
        /// temporary variable so that the [is] allows access of [index]
        final target = hit.target;
        if (target is _Foo && !_trackTaped.contains(target)) {
          _trackTaped.add(target);
          _SELEcTindex(target.indeX);
        }
      }
    }
  }

  _SELEcTindex(int indeX) {
    setState(() {
      SELEctedIndexes.add(indeX);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Listener(
      onPointerDown: _detectTapedItem,onPointerMove: _detectTapedItem,onPointerUp: _clearSELEction,child: GridView.builder(
        key: key,itemCount: 6,physics: NeverScrollableScrollPhysics(),gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3,childAspectRatio: 1.0,crossAxisSpacing: 5.0,mainAxisSpacing: 5.0,itemBuilder: (context,indeX) {
          return Foo(
            index: index,child: Container(
              color: SELEctedIndexes.contains(indeX) ? Colors.red : Colors.blue,);
        },);
  }

  void _clearSELEction(PointerUpEvent event) {
    _trackTaped.clear();
    setState(() {
      SELEctedIndexes.clear();
    });
  }
}

class Foo extends SingleChildRenderObjectWidget {
  final int index;

  Foo({Widget child,key: key);

  @override
  _Foo createRenderObject(BuildContext context) {
    return _Foo()..index = index;
  }

  @override
  void updateRenderObject(BuildContext context,_Foo renderObject) {
    renderObject..index = index;
  }
}

class _Foo extends RenderProxyBox {
  int index;
}

大佬总结

以上是大佬教程为你收集整理的dart – 如何使用颤动在按钮网格中滑动/拖动2个或更多按钮全部内容,希望文章能够帮你解决dart – 如何使用颤动在按钮网格中滑动/拖动2个或更多按钮所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。