-
Notifications
You must be signed in to change notification settings - Fork 29.4k
Open
Open
Copy link
Labels
in triagePresently being triaged by the triage teamPresently being triaged by the triage team
Description
Steps to reproduce
Create a fresh project, and launch the app
flutter create test_app --platform web
cd test_app
flutter run -d web-server --web-hostname 0.0.0.0 --web-port 8080
Notes:
- This issue can be replicated regardless of whether or not
--release
or--debug
is used - This issue can only be replicated on iOS 26 devices and iPadOS 26 devices, on other devices such as iOS 18.x.x this seems to work properly
- This issue can also be replicated on iOS 26 Simulator
- This has been replicated using the ff password apps Apple Passwords, Lastpass, and Bitwarden
- This issue can be replicated on Flutter Versions 3.32.8, and 3.35.6 unfortunately
- This issue can be replicated on the ff browsers on iOS 26 Safari, Chrome, Firefox
Expected results
Autofill should work properly
Actual results
Autofill is not working
Code sample
Code sample
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Login Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const LoginPage(),
);
}
}
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _isPasswordVisible = false;
bool _isLoading = false;
@override
void dispose() {
_emailController.dispose();
_passwordController.dispose();
super.dispose();
}
String? _validateEmail(String? value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+');
if (!emailRegex.hasMatch(value)) {
return 'Please enter a valid email address';
}
return null;
}
String? _validatePassword(String? value) {
if (value == null || value.isEmpty) {
return 'Please enter your password';
}
if (value.length < 6) {
return 'Password must be at least 6 characters long';
}
return null;
}
Future<void> _handleLogin() async {
if (!_formKey.currentState!.validate()) {
return;
}
setState(() {
_isLoading = true;
});
// Simulate login delay
await Future.delayed(const Duration(seconds: 2));
setState(() {
_isLoading = false;
});
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Login attempt for ${_emailController.text}'),
backgroundColor: Colors.green,
),
);
}
}
Widget _buildLoginForm() {
return AutofillGroup(
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Logo or Title
Icon(
Icons.lock_outline,
size: 80,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 16),
Text(
'Welcome Back',
style: Theme.of(
context,
).textTheme.headlineMedium?.copyWith(fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'Sign in to your account',
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
const SizedBox(height: 32),
// Email Field
TextFormField(
controller: _emailController,
keyboardType: TextInputType.emailAddress,
autofillHints: const [AutofillHints.email],
decoration: const InputDecoration(
labelText: 'Email',
hintText: 'Enter your email address',
prefixIcon: Icon(Icons.email_outlined),
border: OutlineInputBorder(),
),
validator: _validateEmail,
textInputAction: TextInputAction.next,
),
const SizedBox(height: 16),
// Password Field
TextFormField(
controller: _passwordController,
obscureText: !_isPasswordVisible,
autofillHints: const [AutofillHints.password],
decoration: InputDecoration(
labelText: 'Password',
hintText: 'Enter your password',
prefixIcon: const Icon(Icons.lock_outlined),
suffixIcon: IconButton(
icon: Icon(
_isPasswordVisible
? Icons.visibility_off_outlined
: Icons.visibility_outlined,
),
onPressed: () {
setState(() {
_isPasswordVisible = !_isPasswordVisible;
});
},
),
border: const OutlineInputBorder(),
),
validator: _validatePassword,
textInputAction: TextInputAction.done,
onFieldSubmitted: (_) => _handleLogin(),
),
const SizedBox(height: 24),
// Login Button
FilledButton(
onPressed: _isLoading ? null : _handleLogin,
style: FilledButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
),
child: _isLoading
? const SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
),
)
: const Text('Sign In'),
),
const SizedBox(height: 16),
// Forgot Password Link
TextButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Forgot password functionality not implemented',
),
),
);
},
child: const Text('Forgot Password?'),
),
],
),
),
);
}
@override
Widget build(BuildContext context) {
final isWeb = kIsWeb;
final screenWidth = MediaQuery.of(context).size.width;
final isWideScreen = screenWidth > 600;
return Scaffold(
body: SafeArea(
child: isWeb && isWideScreen
? Center(
child: SingleChildScrollView(
padding: const EdgeInsets.all(24),
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 400),
child: Card(
elevation: 8,
child: Padding(
padding: const EdgeInsets.all(32),
child: _buildLoginForm(),
),
),
),
),
)
: SingleChildScrollView(
padding: const EdgeInsets.all(24),
child: Column(
children: [
SizedBox(height: MediaQuery.of(context).size.height * 0.1),
_buildLoginForm(),
],
),
),
),
);
}
}```
</details>
### Screenshots or Video
<details open>
<summary>Screenshots / Video demonstration</summary>
[Upload media here]
</details>
### Logs
<details open><summary>Logs</summary>
```console
[Paste your logs here]
Flutter Doctor output
Doctor output
[✓] Flutter (Channel stable, 3.35.6, on macOS 15.7.1 24G231 darwin-arm64, locale en-PH) [339ms]
• Flutter version 3.35.6 on channel stable at /Users/..../fvm/versions/3.35.6
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 9f455d2486 (12 days ago), 2025-10-08 14:55:31 -0500
• Engine revision d2913632a4
• Dart version 3.9.2
• DevTools version 2.48.0
• Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-lldb-debugging
[!] Android toolchain - develop for Android devices (Android SDK version 36.0.0) [1,085ms]
• Android SDK at /Users/..../Library/Android/sdk
• Emulator version 35.6.11.0 (build_id 13610412) (CL:N/A)
• Platform android-36, build-tools 36.0.0
• ANDROID_HOME = /Users/..../Library/Android/sdk
• ANDROID_SDK_ROOT = /Users/..../Library/Android/sdk
• Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
This is the JDK bundled with the latest Android Studio installation on this machine.
To manually set the JDK path, use: `flutter config --jdk-dir="path/to/jdk"`.
• Java version OpenJDK Runtime Environment (build 21.0.6+-13391695-b895.109)
! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 26.0.1) [769ms]
• Xcode at /Applications/Xcode.app/Contents/Developer
• Build 17A400
• CocoaPods version 1.16.2
[✓] Chrome - develop for the web [6ms]
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 2025.1) [6ms]
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version openjdk version "21.0.6" 2025-01-21
[✓] VS Code (version 1.105.1) [5ms]
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.120.0
[✓] Connected device (6 available) [5.9s]
• ...
[✓] Network resources [447ms]
• All expected network resources are available.
Notes:
- Output has been edited to remove some information and been replaced with
...
for privacy - I am using FVM but this has been replicated as well on a separate machine running a fresh flutter install (manually and not via FVM)
Metadata
Metadata
Assignees
Labels
in triagePresently being triaged by the triage teamPresently being triaged by the triage team