gpt4 book ai didi

flutter - 我如何通过拖动它们来选择小部件,但也可以在 flutter 中单独单击它们?

转载 作者:行者123 更新时间:2023-12-05 01:55:21 24 4
gpt4 key购买 nike

我想创建一个可以在多个区域上拖动手指的界面。这会将区域的状态更改为选定状态(参见图片)。

解决这个问题的最佳方法是什么?

起始位置:
Star Position

开始拖动:
Start Dragging

选择第一个区域: Select first area

选定的所有区域: Selected all areas

最佳答案

代码需要针对当前的 Flutter/Dart 版本进行一些更新,但是 this为我工作。

更新代码:


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: 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!.findAncestorRenderObjectOfType<RenderBox>()!;
final result = BoxHitTestResult();
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({required Widget child, required this.index, Key? key}) : super(child: child, key: key);

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

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

class _Foo extends RenderProxyBox {
int index;
_Foo(this.index);
}

关于flutter - 我如何通过拖动它们来选择小部件,但也可以在 flutter 中单独单击它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70277515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com