Я хочу, чтобы эта вещь была в моем контейнере: одно действие при нажатии, одно при длительном нажатии и последнее при длительном нажатии + перетаскивание. Я хочу три разных действия в одном контейнере, и я не могу это сделать, если я исправлю какое-либо одно действие, если не удается другое, теперь я сделал долгое нажатие, показывающее всплывающее меню, и долгое нажатие + перетаскивание, перетаскивая контейнер сценария, и при нажатии открывается новый экран, но onTap вообще не работает, если я попытаюсь исправить onTap, и другие действия перестанут работать. Так что я действительно не знаю, как решить эту проблему, пожалуйста, помогите мне в этом
Widget _buildScriptsGrid() {
final scripts = filteredScripts;
_syncScriptKeys(scripts.length);
return GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 0.70,
),
itemCount: scripts.length,
itemBuilder: (context, index) {
final item = scripts[index];
final key = _scriptKeys[index];
return LongPressDraggable(
data: item.id,
delay: const Duration(milliseconds: 350),
onDragStarted: () {
_scriptDragMoved = false;
final box = key.currentContext?.findRenderObject() as RenderBox?;
if (box == null) return;
const popupSize = Size(220, 130);
final pos = _calculatePopupPosition(box, popupSize);
_removeScriptPopup();
_scriptMenuEntry = _buildScriptPopup(position: pos, script: item);
Overlay.of(context).insert(_scriptMenuEntry!);
},
onDragUpdate: (_) {
if (!_scriptDragMoved) {
_scriptDragMoved = true;
_removeScriptPopup();
}
},
feedback: _scriptDragPreview(item),
childWhenDragging: Opacity(opacity: 0.25, child: _scriptTile(item)),
child: KeyedSubtree(
key: key,
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
_removeScriptPopup();
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => TeleprompterReaderScreen(
script: item,
cameras: widget.cameras,
),
),
);
},
child: _scriptTile(item),
),
),
);
},
);
}
Метод сборки
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: ThemeColors.bgColorOnboard,
body: SafeArea(
bottom: false,
child: GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Align(
alignment: Alignment.topRight,
child: _buildMenuButton(),
),
),
const SizedBox(height: 8),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
'Scripts',
style: const TextStyle(
color: Colors.white,
fontSize: 28,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(height: 8),
_buildSearchBar(),
const SizedBox(height: 32),
Expanded(
child: SingleChildScrollView(
controller: _scrollController,
physics: const BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (searchQuery.isEmpty) ...[
_buildFoldersHeader(),
const SizedBox(height: 12),
if (foldersExpanded) _buildFoldersGrid(),
const SizedBox(height: 32),
],
_buildScriptsHeader(),
const SizedBox(height: 12),
isGrid ? _buildScriptsGrid() : _buildScriptsList(),
],
),
),
),
),
const SizedBox(height: 32),
],
),
if (showMenu) ...[
Positioned.fill(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: _dismissMenu,
onPanDown: (_) => _dismissMenu(),
child: const SizedBox.expand(),
),
),
Positioned(
top: 55,
right: 16,
child: FadeTransition(
opacity: _menuOpacity,
child: ScaleTransition(
scale: _menuScale,
alignment: Alignment.topRight,
child: _buildCustomMenu(),
),
),
),
SizedBox(height: 32),
],
],
),
),
),
);
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -container
Три разных действия на одном контейнере ⇐ IOS
Программируем под IOS
1766034094
Anonymous
Я хочу, чтобы эта вещь была в моем контейнере: одно действие при нажатии, одно при длительном нажатии и последнее при длительном нажатии + перетаскивание. Я хочу три разных действия в одном контейнере, и я не могу это сделать, если я исправлю какое-либо одно действие, если не удается другое, теперь я сделал долгое нажатие, показывающее всплывающее меню, и долгое нажатие + перетаскивание, перетаскивая контейнер сценария, и при нажатии открывается новый экран, но onTap вообще не работает, если я попытаюсь исправить onTap, и другие действия перестанут работать. Так что я действительно не знаю, как решить эту проблему, пожалуйста, помогите мне в этом
Widget _buildScriptsGrid() {
final scripts = filteredScripts;
_syncScriptKeys(scripts.length);
return GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 0.70,
),
itemCount: scripts.length,
itemBuilder: (context, index) {
final item = scripts[index];
final key = _scriptKeys[index];
return LongPressDraggable(
data: item.id,
delay: const Duration(milliseconds: 350),
onDragStarted: () {
_scriptDragMoved = false;
final box = key.currentContext?.findRenderObject() as RenderBox?;
if (box == null) return;
const popupSize = Size(220, 130);
final pos = _calculatePopupPosition(box, popupSize);
_removeScriptPopup();
_scriptMenuEntry = _buildScriptPopup(position: pos, script: item);
Overlay.of(context).insert(_scriptMenuEntry!);
},
onDragUpdate: (_) {
if (!_scriptDragMoved) {
_scriptDragMoved = true;
_removeScriptPopup();
}
},
feedback: _scriptDragPreview(item),
childWhenDragging: Opacity(opacity: 0.25, child: _scriptTile(item)),
child: KeyedSubtree(
key: key,
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
_removeScriptPopup();
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => TeleprompterReaderScreen(
script: item,
cameras: widget.cameras,
),
),
);
},
child: _scriptTile(item),
),
),
);
},
);
}
Метод сборки
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: ThemeColors.bgColorOnboard,
body: SafeArea(
bottom: false,
child: GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Align(
alignment: Alignment.topRight,
child: _buildMenuButton(),
),
),
const SizedBox(height: 8),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
'Scripts',
style: const TextStyle(
color: Colors.white,
fontSize: 28,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(height: 8),
_buildSearchBar(),
const SizedBox(height: 32),
Expanded(
child: SingleChildScrollView(
controller: _scrollController,
physics: const BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (searchQuery.isEmpty) ...[
_buildFoldersHeader(),
const SizedBox(height: 12),
if (foldersExpanded) _buildFoldersGrid(),
const SizedBox(height: 32),
],
_buildScriptsHeader(),
const SizedBox(height: 12),
isGrid ? _buildScriptsGrid() : _buildScriptsList(),
],
),
),
),
),
const SizedBox(height: 32),
],
),
if (showMenu) ...[
Positioned.fill(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: _dismissMenu,
onPanDown: (_) => _dismissMenu(),
child: const SizedBox.expand(),
),
),
Positioned(
top: 55,
right: 16,
child: FadeTransition(
opacity: _menuOpacity,
child: ScaleTransition(
scale: _menuScale,
alignment: Alignment.topRight,
child: _buildCustomMenu(),
),
),
),
SizedBox(height: 32),
],
],
),
),
),
);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79850017/three-different-actions-on-one-container[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия