На iPad после обновления iPados 26, окно приложения может изменить размер между компактным (телефон) и обычными (планшетными) классами размера во время выполнения. Один класс размера и окно изменяется, показанная поверхность не адаптируется. Например, нижний лист, открытый в компакте, остается листом после изменения размера до регулярного, вместо того, чтобы стать центральным диалогом. это автоматически.
фактическое поведение
Выбранная поверхность заблокирована до того, что было во время презентации (лист остается листом; диалог остается диалогом), даже после изменений класса. Слайд Over)
ios 16+ (iPados 16+) [Пользовательская среда: iPados 16+/iPados 17+ также затронута]. IPados26.
запустите приложение с компактной шириной (по телефону) и измените размер приложения.
Когда модальный открыт, измените размер окна на регулярную ширину (таблетку).
Заметьте, что поверхность остается нижним листом, а не центральным диалогом.
Обратите с собой корпус: начинайте регулярно, модал открыть, решайте размер в комплект; Диалог не превращается в лист.
минимальный воспроизводимый образец (один файл: lib/main.dart)
Код: Выделить всё
import 'package:flutter/material.dart';
void main() => runApp(const DemoApp());
class DemoApp extends StatelessWidget {
const DemoApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Adaptive Dialogs Demo',
theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.indigo),
home: const HomePage(),
debugShowCheckedModeBanner: false,
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Adaptive Modal (Mobile → Sheet, Tablet → Dialog)')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () => _openAdaptiveModal(context),
child: const Text('Open Adaptive Modal'),
),
],
),
),
);
}
void _openAdaptiveModal(BuildContext context) {
final shortestSide = MediaQuery.of(context).size.shortestSide;
final isTablet = shortestSide >= 600; // iPad/tablet breakpoint
if (!isTablet) {
// Mobile → Bottom Sheet
showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: false,
backgroundColor: Theme.of(context).colorScheme.surface,
showDragHandle: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
),
builder: (ctx) {
return Padding(
padding: const EdgeInsets.fromLTRB(16, 8, 16, 24),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Modal Bottom Sheet (Mobile)',
style: Theme.of(ctx).textTheme.titleLarge,
),
const SizedBox(height: 12),
const Text('Opened via showModalBottomSheet for mobile view.'),
const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('CLOSE'),
),
],
),
],
),
);
},
);
} else {
// Tablet → Center Dialog
showDialog(
context: context,
barrierDismissible: true,
builder: (ctx) {
return AlertDialog(
title: const Text('Center Dialog (Tablet)'),
content: const Text('Opened via showDialog for tablet view.'),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('CANCEL'),
),
FilledButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('OK'),
),
],
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
);
},
);
}
}
}
вручную прослушивание изменений размера, отклонение текущего модала и повторно открыть другую поверхность. Это работает, но является сложным и хрупким.
Также, когда он закрыт и вновь открыт, введенные данные будут потеряны. < /P>
Вопросы < /strong> < /p>
- Есть ли рекомендуемый рамный рисунок, чтобы сделать модальный класс, адаптируемый, в то время как навсегда нет, чтобы адаптироваться на основе. API?
Подробнее здесь: https://stackoverflow.com/questions/797 ... indow-is-r