Commit fda33894 authored by DatHV's avatar DatHV
Browse files

cap nhat giao dien

parent 75178f29
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:mypoint_flutter_app/widgets/back_button.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import '../../base/base_screen.dart';
import '../../base/basic_state.dart';
class BaseWebViewInput { class BaseWebViewInput {
final String? title; final String? title;
final String url; final String url;
final bool isFullScreen; final bool isFullScreen;
const BaseWebViewInput({ const BaseWebViewInput({this.title, required this.url, this.isFullScreen = false});
this.title,
required this.url,
this.isFullScreen = false,
});
} }
class BaseWebViewScreen extends StatefulWidget { class BaseWebViewScreen extends BaseScreen {
const BaseWebViewScreen({super.key}); const BaseWebViewScreen({super.key});
@override @override
State<BaseWebViewScreen> createState() => _BaseWebViewScreenState(); State<BaseWebViewScreen> createState() => _BaseWebViewScreenState();
} }
class _BaseWebViewScreenState extends State<BaseWebViewScreen> { class _BaseWebViewScreenState extends BaseState<BaseWebViewScreen> with BasicState {
late final BaseWebViewInput input; late final BaseWebViewInput input;
late final WebViewController _controller; late final WebViewController _controller;
String? _dynamicTitle; String? _dynamicTitle;
...@@ -29,76 +30,67 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> { ...@@ -29,76 +30,67 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
final args = Get.arguments; final args = Get.arguments;
if (args is BaseWebViewInput) { if (args is BaseWebViewInput) {
input = args; input = args;
} else { } else {
throw Exception('BaseWebViewInput is required in arguments'); WidgetsBinding.instance.addPostFrameCallback((_) {
Get.back();
});
return;
} }
_controller =
_controller = WebViewController() WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted) ..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate( ..setBackgroundColor(Colors.transparent)
NavigationDelegate( ..setNavigationDelegate(
onPageFinished: (_) async { NavigationDelegate(
final title = await _controller.getTitle(); onPageFinished: (_) async {
setState(() { final title = await _controller.getTitle();
_dynamicTitle = title; setState(() {
}); _dynamicTitle = title;
}, });
onWebResourceError: (_) { },
_showWebErrorDialog(); onWebResourceError: (error) {
}, showAlertError(content: error.description);
), },
) ),
..loadRequest(Uri.parse(input.url));
_clearCookies();
}
Future<void> _clearCookies() async {
final cookieManager = WebViewCookieManager();
await cookieManager.clearCookies();
}
void _showWebErrorDialog() {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: const Text("Lỗi"),
content: const Text("Không thể tải nội dung. Vui lòng thử lại sau."),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text("Đóng"),
) )
], ..loadRequest(Uri.parse(input.url));
), _clearCookies();
);
} }
@override @override
Widget build(BuildContext context) { Widget createBody() {
return Scaffold( return Scaffold(
appBar: input.isFullScreen appBar:
? null input.isFullScreen
: AppBar( ? null
title: Text( : AppBar(
input.title ?? _dynamicTitle ?? Uri.parse(input.url).host, title: Text(
style: const TextStyle(fontSize: 16), input.title ?? _dynamicTitle ?? Uri.parse(input.url).host,
), style: const TextStyle(fontSize: 16),
leading: IconButton( ),
icon: const Icon(Icons.arrow_back), leading: CustomBackButton(onPressed: _handleBack),
onPressed: _handleBack, ),
),
),
body: SafeArea( body: SafeArea(
child: WebViewWidget(controller: _controller), child: WebViewWidget(
controller: _controller,
gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{
Factory<VerticalDragGestureRecognizer>(
VerticalDragGestureRecognizer.new,
),
},
),
), ),
); );
} }
Future<void> _clearCookies() async {
final cookieManager = WebViewCookieManager();
await cookieManager.clearCookies();
}
void _handleBack() async { void _handleBack() async {
if (await _controller.canGoBack()) { if (await _controller.canGoBack()) {
_controller.goBack(); _controller.goBack();
...@@ -106,4 +98,4 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> { ...@@ -106,4 +98,4 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> {
if (context.mounted) Navigator.of(context).pop(); if (context.mounted) Navigator.of(context).pop();
} }
} }
} }
\ No newline at end of file
import 'package:get/get_navigation/src/routes/get_route.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/screen/news/news_list_screen.dart';
import '../screen/achievement/achievement_list_screen.dart';
import '../screen/game/game_cards/game_card_screen.dart'; import '../screen/game/game_cards/game_card_screen.dart';
import '../screen/login/login_screen.dart'; import '../screen/login/login_screen.dart';
import '../screen/main_tab_screen/main_tab_screen.dart'; import '../screen/main_tab_screen/main_tab_screen.dart';
import '../screen/notification/notification_screen.dart'; import '../screen/notification/notification_screen.dart';
import '../screen/onboarding/onboarding_screen.dart'; import '../screen/onboarding/onboarding_screen.dart';
import '../screen/pageDetail/campaign_detail_screen.dart';
import '../screen/register_campaign/register_form_input_screen.dart'; import '../screen/register_campaign/register_form_input_screen.dart';
import '../screen/setting/setting_screen.dart'; import '../screen/setting/setting_screen.dart';
import '../screen/splash/splash_screen.dart'; import '../screen/splash/splash_screen.dart';
...@@ -12,6 +16,7 @@ import '../screen/transaction/history/transaction_history_detail_screen.dart'; ...@@ -12,6 +16,7 @@ import '../screen/transaction/history/transaction_history_detail_screen.dart';
import '../screen/transaction/transaction_detail_screen.dart'; import '../screen/transaction/transaction_detail_screen.dart';
import '../screen/voucher/detail/voucher_detail_screen.dart'; import '../screen/voucher/detail/voucher_detail_screen.dart';
import '../screen/voucher/voucher_list/voucher_list_screen.dart'; import '../screen/voucher/voucher_list/voucher_list_screen.dart';
import '../screen/vplay_game_center/vplay_game_center_screen.dart';
import '../screen/webview/payment_web_view_screen.dart'; import '../screen/webview/payment_web_view_screen.dart';
import '../screen/webview/web_view_screen.dart'; import '../screen/webview/web_view_screen.dart';
...@@ -30,6 +35,10 @@ const paymentWebViewScreen = '/paymentWebViewScreen'; ...@@ -30,6 +35,10 @@ const paymentWebViewScreen = '/paymentWebViewScreen';
const transactionHistoryDetailScreen = '/transactionHistoryDetailScreen'; const transactionHistoryDetailScreen = '/transactionHistoryDetailScreen';
const supportScreen = '/supportScreen'; const supportScreen = '/supportScreen';
const notificationScreen = '/notificationScreen'; const notificationScreen = '/notificationScreen';
const campaignDetailScreen = '/campaignDetailScreen';
const newsListScreen = '/newsListScreen';
const achievementListScreen = '/achievementListScreen';
const vplayGameCenterScreen = '/vplayGameCenterScreen';
class RouterPage { class RouterPage {
static List<GetPage> pages() { static List<GetPage> pages() {
...@@ -40,21 +49,39 @@ class RouterPage { ...@@ -40,21 +49,39 @@ class RouterPage {
static List<GetPage> _pages() { static List<GetPage> _pages() {
return [ return [
GetPage(name: splashScreen, page: () => const SplashScreen()), GetPage(name: splashScreen, page: () => SplashScreen()),
GetPage(name: onboardingScreen, page: () => const OnboardingScreen()), GetPage(name: onboardingScreen, page: () => OnboardingScreen()),
GetPage(name: loginScreen, page: () => const LoginScreen()), GetPage(name: loginScreen, page: () => LoginScreen()),
GetPage(name: mainScreen, page: () => const MainTabScreen()), GetPage(name: mainScreen, page: () => MainTabScreen(), customTransition: NoSwipeBackTransition()),
GetPage(name: settingScreen, page: () => const SettingScreen()), GetPage(name: settingScreen, page: () => SettingScreen()),
GetPage(name: vouchersScreen, page: () => VoucherListScreen(),), GetPage(name: vouchersScreen, page: () => VoucherListScreen()),
GetPage(name: voucherDetailScreen, page: () => VoucherDetailScreen(),), GetPage(name: voucherDetailScreen, page: () => VoucherDetailScreen()),
GetPage(name: gameCardScreen, page: () => GameCardScreen(),), GetPage(name: gameCardScreen, page: () => GameCardScreen()),
GetPage(name: registerFormInputScreen, page: () => RegisterFormInputScreen(),), GetPage(name: registerFormInputScreen, page: () => RegisterFormInputScreen()),
GetPage(name: transactionDetailScreen, page: () => TransactionDetailScreen(),), GetPage(name: transactionDetailScreen, page: () => TransactionDetailScreen()),
GetPage(name: baseWebViewScreen, page: () => BaseWebViewScreen(),), GetPage(name: baseWebViewScreen, page: () => BaseWebViewScreen()),
GetPage(name: paymentWebViewScreen, page: () => PaymentWebViewScreen(),), GetPage(name: paymentWebViewScreen, page: () => PaymentWebViewScreen()),
GetPage(name: transactionHistoryDetailScreen, page: () => TransactionHistoryDetailScreen(),), GetPage(name: transactionHistoryDetailScreen, page: () => TransactionHistoryDetailScreen()),
GetPage(name: supportScreen, page: () => SupportScreen(),), GetPage(name: supportScreen, page: () => SupportScreen()),
GetPage(name: notificationScreen, page: () => NotificationScreen(),), GetPage(name: notificationScreen, page: () => NotificationScreen()),
GetPage(name: campaignDetailScreen, page: () => CampaignDetailScreen()),
GetPage(name: newsListScreen, page: () => NewsListScreen()),
GetPage(name: achievementListScreen, page: () => AchievementListScreen()),
GetPage(name: vplayGameCenterScreen, page: () => VplayGameCenterScreen()),
]; ];
} }
}
class NoSwipeBackTransition extends CustomTransition {
@override
Widget buildTransition(
BuildContext context,
Curve? curve,
Alignment? alignment,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
return child;
}
} }
\ No newline at end of file
...@@ -43,12 +43,9 @@ class ButtonConfigModel { ...@@ -43,12 +43,9 @@ class ButtonConfigModel {
Map<String, dynamic> toJson() => _$ButtonConfigModelToJson(this); Map<String, dynamic> toJson() => _$ButtonConfigModelToJson(this);
DirectionalScreen? get directionScreen { DirectionalScreen? get directionScreen {
if (clickActionType != null || clickActionParam != null) { DirectionalScreen.build(
return DirectionalScreen( clickActionType: clickActionType,
clickActionType: clickActionType, clickActionParam: clickActionParam,
clickActionParam: clickActionParam, );
);
}
return null;
} }
} }
...@@ -37,12 +37,13 @@ class CustomBackButton extends StatelessWidget { ...@@ -37,12 +37,13 @@ class CustomBackButton extends StatelessWidget {
onPressed: onPressed:
onPressed ?? onPressed ??
() { () {
if (Navigator.canPop(context)) { Get.back();
Navigator.pop(context); // if (Navigator.canPop(context)) {
} else { // Navigator.pop(context);
DataPreference.instance.clearData(); // } else {
Get.offAllNamed(onboardingScreen); // DataPreference.instance.clearData();
} // Get.offAllNamed(onboardingScreen);
// }
}, },
), ),
), ),
......
...@@ -51,6 +51,7 @@ dependencies: ...@@ -51,6 +51,7 @@ dependencies:
webview_flutter: ^4.2.2 webview_flutter: ^4.2.2
qr_flutter: ^4.0.0 qr_flutter: ^4.0.0
barcode_widget: ^2.0.1 barcode_widget: ^2.0.1
infinite_carousel: ^1.0.3
game_miniapp: game_miniapp:
path: ../mini_app/game_miniapp path: ../mini_app/game_miniapp
dev_dependencies: dev_dependencies:
......
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