mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 10:37:11 -04:00 
			
		
		
		
	* chore(mobile): search field in separate widget * fix: removed unnecessary use of context * chore: minor styling tweak * fix: controller not bound --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:immich_mobile/extensions/build_context_extensions.dart';
 | |
| import 'package:immich_mobile/extensions/theme_extensions.dart';
 | |
| 
 | |
| class SearchField extends StatelessWidget {
 | |
|   const SearchField({
 | |
|     super.key,
 | |
|     required this.hintText,
 | |
|     this.autofocus = false,
 | |
|     this.controller,
 | |
|     this.focusNode,
 | |
|     this.onChanged,
 | |
|     this.onSubmitted,
 | |
|     this.onTapOutside,
 | |
|     this.contentPadding = const EdgeInsets.only(left: 24),
 | |
|     this.prefixIcon,
 | |
|     this.suffixIcon,
 | |
|     this.filled = false,
 | |
|   });
 | |
| 
 | |
|   final FocusNode? focusNode;
 | |
|   final void Function(String)? onChanged;
 | |
|   final void Function(String)? onSubmitted;
 | |
|   final void Function(PointerDownEvent)? onTapOutside;
 | |
|   final TextEditingController? controller;
 | |
|   final String hintText;
 | |
|   final EdgeInsetsGeometry contentPadding;
 | |
|   final Widget? prefixIcon;
 | |
|   final Widget? suffixIcon;
 | |
|   final bool autofocus;
 | |
|   final bool filled;
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return TextField(
 | |
|       controller: controller,
 | |
|       autofocus: autofocus,
 | |
|       focusNode: focusNode,
 | |
|       onChanged: onChanged,
 | |
|       onTapOutside: onTapOutside ?? (_) => focusNode?.unfocus(),
 | |
|       onSubmitted: onSubmitted,
 | |
|       decoration: InputDecoration(
 | |
|         contentPadding: contentPadding,
 | |
|         filled: filled,
 | |
|         fillColor: context.primaryColor.withValues(alpha: 0.1),
 | |
|         hintStyle: context.textTheme.bodyLarge?.copyWith(
 | |
|           color: context.themeData.colorScheme.onSurfaceSecondary,
 | |
|         ),
 | |
|         border: OutlineInputBorder(
 | |
|           borderRadius: BorderRadius.circular(25),
 | |
|           borderSide: BorderSide(
 | |
|             color: context.colorScheme.surfaceDim,
 | |
|           ),
 | |
|         ),
 | |
|         enabledBorder: OutlineInputBorder(
 | |
|           borderRadius: BorderRadius.circular(25),
 | |
|           borderSide: BorderSide(
 | |
|             color: context.colorScheme.surfaceContainer,
 | |
|           ),
 | |
|         ),
 | |
|         disabledBorder: OutlineInputBorder(
 | |
|           borderRadius: BorderRadius.circular(25),
 | |
|           borderSide: BorderSide(
 | |
|             color: context.colorScheme.surfaceDim,
 | |
|           ),
 | |
|         ),
 | |
|         focusedBorder: OutlineInputBorder(
 | |
|           borderRadius: BorderRadius.circular(25),
 | |
|           borderSide: BorderSide(
 | |
|             color: context.colorScheme.primary.withAlpha(100),
 | |
|           ),
 | |
|         ),
 | |
|         prefixIcon: prefixIcon,
 | |
|         suffixIcon: suffixIcon,
 | |
|         hintText: hintText,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |