Commit 38520c1e authored by DatHV's avatar DatHV
Browse files

update seach top navi bar

parent 55151ba2
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/resources/base_color.dart';
import '../../widgets/custom_navigation_bar.dart';
import 'location_address_viewmodel.dart';
......@@ -36,6 +37,7 @@ class LocationAddressScreen extends StatefulWidget {
class _LocationAddressScreenState extends State<LocationAddressScreen> {
late final LocationAddressViewModel viewModel;
final ScrollController scrollController = ScrollController();
var _title = "Địa chỉ";
@override
void initState() {
......@@ -48,14 +50,14 @@ class _LocationAddressScreenState extends State<LocationAddressScreen> {
type: type,
provinceCode: args['provinceCode'] ?? '',
));
_title = type == LocationAddressType.province ? "Chọn Tỉnh/Thành phố" : "Chọn Quận/Huyện";
viewModel.selectedCode.value = selectedCode;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomNavigationBar(title: "Địa chỉ"),
// backgroundColor: Colors.transparent,
appBar: CustomNavigationBar(title: _title),
body: SafeArea(
child: Column(
children: [
......@@ -81,7 +83,6 @@ class _LocationAddressScreenState extends State<LocationAddressScreen> {
Expanded(
child: Obx(() {
final items = viewModel.displayItems;
// Scroll đến vị trí selected sau khi hiển thị list
WidgetsBinding.instance.addPostFrameCallback((_) {
final index = items.indexWhere((e) => e.code == viewModel.selectedCode.value);
if (index != -1 && scrollController.hasClients) {
......@@ -100,8 +101,8 @@ class _LocationAddressScreenState extends State<LocationAddressScreen> {
final item = items[index];
final isSelected = viewModel.selectedCode.value == item.code;
return ListTile(
title: Text(item.name ?? '', style: TextStyle(color: isSelected ? Colors.blue : Colors.black87)),
trailing: isSelected ? const Icon(Icons.check, color: Colors.blue) : null,
title: Text(item.name ?? '', style: TextStyle(color: isSelected ? BaseColor.primary500 : Colors.black87)),
trailing: isSelected ? const Icon(Icons.check, color: BaseColor.primary500) : null,
onTap: () => viewModel.select(item),
);
},
......
......@@ -281,10 +281,10 @@ class _PersonalEditScreenState extends BaseState<PersonalEditScreen> with BasicS
gender.display,
style: TextStyle(
fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
color: isSelected ? Colors.blue : Colors.black,
color: isSelected ? BaseColor.primary500 : Colors.black,
),
),
trailing: isSelected ? const Icon(Icons.check, color: Colors.blue) : null,
trailing: isSelected ? const Icon(Icons.check, color: BaseColor.primary500) : null,
onTap: () {
Navigator.of(context).pop();
onSelected(gender);
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../screen/home/header_home_viewmodel.dart';
import 'back_button.dart';
import 'image_loader.dart';
class CustomSearchNavigationBar extends StatefulWidget implements PreferredSizeWidget {
final ValueChanged<String>? onSearchChanged;
......@@ -13,7 +15,7 @@ class CustomSearchNavigationBar extends StatefulWidget implements PreferredSizeW
super.key,
this.onSearchChanged,
this.hintText = 'Tìm kiếm...',
this.backgroundImage = "assets/images/bg_header_navi.png",
this.backgroundImage, // = "assets/images/bg_header_navi.png",
this.showBackButton = true,
this.rightButtons = const [],
});
......@@ -27,6 +29,7 @@ class CustomSearchNavigationBar extends StatefulWidget implements PreferredSizeW
class _CustomSearchNavigationBarState extends State<CustomSearchNavigationBar> {
final TextEditingController _controller = TextEditingController();
final _defaultBgImage = 'assets/images/bg_header_navi.png';
@override
void dispose() {
......@@ -36,82 +39,87 @@ class _CustomSearchNavigationBarState extends State<CustomSearchNavigationBar> {
@override
Widget build(BuildContext context) {
final double statusBarHeight = MediaQuery.of(context).padding.top;
if (widget.backgroundImage != null && widget.backgroundImage!.isNotEmpty) {
return _buildAppBar(widget.backgroundImage!, context);
}
final theme = Get.find<HeaderThemeController>();
return Obx(() {
final bg = theme.background.value ?? _defaultBgImage;
return _buildAppBar(bg, context);
});
}
return Container(
Widget _buildAppBar(String bgImage, BuildContext context) {
final bool isHttp = bgImage.startsWith('http://') || bgImage.startsWith('https://');
final double statusBarHeight = MediaQuery.of(context).padding.top;
return SizedBox(
height: statusBarHeight + kToolbarHeight,
decoration: BoxDecoration(
image: widget.backgroundImage != null
? DecorationImage(
image: AssetImage(widget.backgroundImage!),
fit: BoxFit.cover,
)
: null,
color: widget.backgroundImage == null ? Colors.white : null,
),
child: SafeArea(
bottom: false,
child: Stack(
alignment: Alignment.center,
children: [
Positioned(
left: widget.showBackButton ? 68 : 16,
right: widget.rightButtons.isNotEmpty ? 60 : 16,
child: Container(
height: 36,
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
const Icon(Icons.search, size: 20),
const SizedBox(width: 4),
Expanded(
child: TextField(
controller: _controller,
onChanged: (value) {
setState(() {}); // Update UI for suffix icon
widget.onSearchChanged?.call(value);
},
decoration: InputDecoration(
border: InputBorder.none,
hintText: widget.hintText,
isDense: true,
contentPadding: EdgeInsets.zero,
// decoration: BoxDecoration(
// image:
// widget.backgroundImage != null
// ? DecorationImage(image: AssetImage(widget.backgroundImage!), fit: BoxFit.cover)
// : null,
// color: widget.backgroundImage == null ? Colors.white : null,
// ),
child: Stack(
fit: StackFit.expand,
children: [
if (bgImage.isNotEmpty)
isHttp
? loadNetworkImage(url: bgImage, fit: BoxFit.cover, placeholderAsset: _defaultBgImage)
: Image.asset(_defaultBgImage, fit: BoxFit.cover),
SafeArea(
bottom: false,
child: Stack(
alignment: Alignment.center,
children: [
Positioned(
left: widget.showBackButton ? 68 : 16,
right: widget.rightButtons.isNotEmpty ? 60 : 16,
child: Container(
height: 36,
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(12)),
child: Row(
children: [
const Icon(Icons.search, size: 20),
const SizedBox(width: 4),
Expanded(
child: TextField(
controller: _controller,
onChanged: (value) {
setState(() {}); // Update UI for suffix icon
widget.onSearchChanged?.call(value);
},
decoration: InputDecoration(
border: InputBorder.none,
hintText: widget.hintText,
isDense: true,
contentPadding: EdgeInsets.zero,
),
),
),
),
if (_controller.text.isNotEmpty)
GestureDetector(
onTap: () {
_controller.clear();
widget.onSearchChanged?.call('');
setState(() {});
},
child: const Icon(Icons.close, size: 20),
),
],
),
if (_controller.text.isNotEmpty)
GestureDetector(
onTap: () {
_controller.clear();
widget.onSearchChanged?.call('');
setState(() {});
},
child: const Icon(Icons.close, size: 20),
),
],
),
),
),
if (widget.showBackButton) Positioned(left: 12, child: CustomBackButton()),
if (widget.rightButtons.isNotEmpty)
Positioned(right: 12, child: Row(mainAxisSize: MainAxisSize.min, children: widget.rightButtons)),
],
),
if (widget.showBackButton)
Positioned(
left: 12,
child: CustomBackButton(),
),
if (widget.rightButtons.isNotEmpty)
Positioned(
right: 12,
child: Row(
mainAxisSize: MainAxisSize.min,
children: widget.rightButtons,
),
),
],
),
),
],
),
);
}
}
\ No newline at end of file
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment