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,16 +30,19 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> { ...@@ -29,16 +30,19 @@ 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)
..setBackgroundColor(Colors.transparent)
..setNavigationDelegate( ..setNavigationDelegate(
NavigationDelegate( NavigationDelegate(
onPageFinished: (_) async { onPageFinished: (_) async {
...@@ -47,58 +51,46 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> { ...@@ -47,58 +51,46 @@ class _BaseWebViewScreenState extends State<BaseWebViewScreen> {
_dynamicTitle = title; _dynamicTitle = title;
}); });
}, },
onWebResourceError: (_) { onWebResourceError: (error) {
_showWebErrorDialog(); showAlertError(content: error.description);
}, },
), ),
) )
..loadRequest(Uri.parse(input.url)); ..loadRequest(Uri.parse(input.url));
_clearCookies(); _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"),
)
],
),
);
}
@override @override
Widget build(BuildContext context) { Widget createBody() {
return Scaffold( return Scaffold(
appBar: input.isFullScreen appBar:
input.isFullScreen
? null ? null
: AppBar( : AppBar(
title: Text( title: Text(
input.title ?? _dynamicTitle ?? Uri.parse(input.url).host, input.title ?? _dynamicTitle ?? Uri.parse(input.url).host,
style: const TextStyle(fontSize: 16), style: const TextStyle(fontSize: 16),
), ),
leading: IconButton( leading: CustomBackButton(onPressed: _handleBack),
icon: const Icon(Icons.arrow_back),
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();
......
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