mod: 本地缓存字段修改、登录状态

This commit is contained in:
guozhigq
2023-08-20 14:28:50 +08:00
parent 8627869309
commit 83341cd62b
29 changed files with 217 additions and 167 deletions

View File

@ -11,17 +11,19 @@ class BangumiController extends GetxController {
RxList<BangumiListItemModel> bangumiFollowList = [BangumiListItemModel()].obs;
int _currentPage = 1;
bool isLoadingMore = true;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
RxBool userLogin = false.obs;
late int mid;
var userInfo;
@override
void onInit() {
super.onInit();
if (user.get(UserBoxKey.userMid) != null) {
mid = int.parse(user.get(UserBoxKey.userMid).toString());
userInfo = userInfoCache.get('userInfoCache');
if (userInfo != null) {
mid = userInfo.mid;
}
userLogin.value = user.get(UserBoxKey.userLogin) != null;
userLogin.value = userInfo != null;
}
Future queryBangumiListFeed({type = 'init'}) async {

View File

@ -49,7 +49,7 @@ class BangumiIntroController extends GetxController {
RxBool hasCoin = false.obs;
// 是否收藏
RxBool hasFav = false.obs;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
bool userLogin = false;
Rx<FavFolderData> favFolderData = FavFolderData().obs;
List addMediaIdsNew = [];
@ -57,6 +57,7 @@ class BangumiIntroController extends GetxController {
// 关注状态 默认未关注
RxMap followStatus = {}.obs;
int _tempThemeValue = -1;
var userInfo;
@override
void onInit() {
@ -82,7 +83,8 @@ class BangumiIntroController extends GetxController {
// videoItem!['owner'] = args.owner;
}
}
userLogin = user.get(UserBoxKey.userLogin) != null;
userInfo = userInfoCache.get('userInfoCache');
userLogin = userInfo != null;
}
// 获取番剧简介&选集
@ -142,7 +144,7 @@ class BangumiIntroController extends GetxController {
// 投币
Future actionCoinVideo() async {
if (user.get(UserBoxKey.userMid) == null) {
if (userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}
@ -283,7 +285,7 @@ class BangumiIntroController extends GetxController {
Future queryVideoInFolder() async {
var result = await VideoHttp.videoInFolder(
mid: user.get(UserBoxKey.userMid), rid: IdUtils.bv2av(bvid));
mid: userInfo.mid, rid: IdUtils.bv2av(bvid));
if (result['status']) {
favFolderData.value = result['data'];
}

View File

@ -121,7 +121,7 @@ class _BangumiInfoState extends State<BangumiInfo> {
// 收藏
showFavBottomSheet() {
if (bangumiIntroController.user.get(UserBoxKey.userMid) == null) {
if (bangumiIntroController.userInfo.mid == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -51,12 +51,14 @@ class DynamicsController extends GetxController {
];
bool flag = false;
RxInt initialValue = 1.obs;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
RxBool userLogin = false.obs;
var userInfo;
@override
void onInit() {
userLogin.value = user.get(UserBoxKey.userLogin, defaultValue: false);
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
super.onInit();
}

View File

@ -30,7 +30,7 @@ class _DynamicsPageState extends State<DynamicsPage>
late Future _futureBuilderFuture;
late Future _futureBuilderFutureUp;
bool _isLoadingMore = false;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
EventBus eventBus = EventBus();
late ScrollController scrollController;

View File

@ -24,7 +24,8 @@ class _UpPanelState extends State<UpPanel> {
List<UpItem> upList = [];
List<LiveUserItem> liveList = [];
static const itemPadding = EdgeInsets.symmetric(horizontal: 5, vertical: 0);
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
var userInfo;
@override
void initState() {
@ -36,12 +37,13 @@ class _UpPanelState extends State<UpPanel> {
UpItem(
face: 'https://files.catbox.moe/8uc48f.png', uname: '全部动态', mid: -1),
);
userInfo = userInfoCache.get('userInfoCache');
upList.insert(
1,
UpItem(
face: user.get(UserBoxKey.userFace),
face: userInfo.face,
uname: '',
mid: user.get(UserBoxKey.userMid),
mid: userInfo.mid,
),
);
}

View File

@ -5,19 +5,22 @@ import 'package:pilipala/models/fans/result.dart';
import 'package:pilipala/utils/storage.dart';
class FansController extends GetxController {
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
int pn = 1;
int total = 0;
RxList<FansItemModel> fansList = [FansItemModel()].obs;
late int mid;
late String name;
var userInfo;
@override
void onInit() {
super.onInit();
mid = int.parse(
Get.parameters['mid'] ?? user.get(UserBoxKey.userMid).toString());
name = Get.parameters['name'] ?? user.get(UserBoxKey.userName);
userInfo = userInfoCache.get('userInfoCache');
mid = Get.parameters['mid'] != null
? int.parse(Get.parameters['mid']!)
: userInfo.mid;
name = Get.parameters['name'] ?? userInfo.uname;
}
Future queryFans(type) async {

View File

@ -1,16 +1,24 @@
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/http/user.dart';
import 'package:pilipala/models/user/fav_folder.dart';
import 'package:pilipala/models/user/info.dart';
import 'package:pilipala/utils/storage.dart';
class FavController extends GetxController {
Rx<FavFolderData> favFolderData = FavFolderData().obs;
Box userInfoCache = GStrorage.userInfo;
UserInfoData? userInfo;
Future<dynamic> queryFavFolder() async {
userInfo = userInfoCache.get('userInfoCache');
if (userInfo == null) {
return {'status': false, 'msg': '账号未登录'};
}
var res = await await UserHttp.userfavFolder(
pn: 1,
ps: 10,
mid: GStrorage.user.get(UserBoxKey.userMid) ?? 0,
mid: userInfo!.mid!,
);
if (res['status']) {
favFolderData.value = res['data'];

View File

@ -5,19 +5,22 @@ import 'package:pilipala/models/follow/result.dart';
import 'package:pilipala/utils/storage.dart';
class FollowController extends GetxController {
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
int pn = 1;
int total = 0;
RxList<FollowItemModel> followList = [FollowItemModel()].obs;
late int mid;
late String name;
var userInfo;
@override
void onInit() {
super.onInit();
mid = int.parse(
Get.parameters['mid'] ?? user.get(UserBoxKey.userMid).toString());
name = Get.parameters['name'] ?? user.get(UserBoxKey.userName);
userInfo = userInfoCache.get('userInfoCache');
mid = Get.parameters['mid'] != null
? int.parse(Get.parameters['mid']!)
: userInfo.mid;
name = Get.parameters['name'] ?? userInfo.uname;
}
Future queryFollowings(type) async {

View File

@ -11,16 +11,17 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
late TabController tabController;
late List tabsCtrList;
late List<Widget> tabsPageList;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
RxBool userLogin = false.obs;
RxString userFace = ''.obs;
var userInfo;
@override
void onInit() {
super.onInit();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
userFace.value = user.get(UserBoxKey.userFace) ?? '';
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
userFace.value = userInfo != null ? userInfo.face : '';
// 进行tabs配置
tabs = tabsConfig;
@ -48,7 +49,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
// 更新登录状态
void updateLoginStatus(val) {
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = val ?? false;
userFace.value = user.get(UserBoxKey.userFace) ?? '';
userFace.value = userInfo != null ? userInfo.face : '';
}
}

View File

@ -6,13 +6,14 @@ import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/pages/mine/view.dart';
import 'package:pilipala/utils/storage.dart';
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
class HomeAppBar extends StatelessWidget {
const HomeAppBar({super.key});
@override
Widget build(BuildContext context) {
var userInfo = userInfoCache.get('userInfoCache');
return SliverAppBar(
// forceElevated: true,
scrolledUnderElevation: 0,
@ -55,7 +56,7 @@ class HomeAppBar extends StatelessWidget {
const SizedBox(width: 6),
/// TODO
if (user.get(UserBoxKey.userLogin)) ...[
if (userInfo != null) ...[
GestureDetector(
onTap: () => showModalBottomSheet(
context: context,
@ -70,7 +71,7 @@ class HomeAppBar extends StatelessWidget {
type: 'avatar',
width: 32,
height: 32,
src: user.get(UserBoxKey.userMid),
src: userInfo.face,
),
),
const SizedBox(width: 10),

View File

@ -8,7 +8,7 @@ import 'package:pilipala/utils/storage.dart';
class MediaController extends GetxController {
Rx<FavFolderData> favFolderData = FavFolderData().obs;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
RxBool userLogin = false.obs;
List list = [
{
@ -34,21 +34,23 @@ class MediaController extends GetxController {
'onTap': () => Get.toNamed('/later'),
},
];
var userInfo;
@override
void onInit() {
super.onInit();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
}
Future<dynamic> queryFavFolder() async {
if (!userLogin.value || GStrorage.user.get(UserBoxKey.userMid) == null) {
if (!userLogin.value || GStrorage.userInfo.get('userInfoCache') == null) {
return {'status': false, 'data': [], 'msg': '未登录'};
}
var res = await await UserHttp.userfavFolder(
pn: 1,
ps: 5,
mid: GStrorage.user.get(UserBoxKey.userMid),
mid: GStrorage.userInfo.get('userInfoCache').mid,
);
favFolderData.value = res['data'];
return res;

View File

@ -14,16 +14,18 @@ class MemberController extends GetxController {
Map? userStat;
String? face;
String? heroTag;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
late int ownerMid;
// 投稿列表
RxList<VListItemModel>? archiveList = [VListItemModel()].obs;
var userInfo;
@override
void onInit() {
super.onInit();
mid = int.parse(Get.parameters['mid']!);
ownerMid = user.get(UserBoxKey.userMid) ?? -1;
userInfo = userInfoCache.get('userInfoCache');
ownerMid = userInfo != null ? userInfo.mid : -1;
face = Get.arguments['face'] ?? '';
heroTag = Get.arguments['heroTag'] ?? '';
}
@ -57,7 +59,7 @@ class MemberController extends GetxController {
// 关注/取关up
Future actionRelationMod() async {
if (user.get(UserBoxKey.userMid) == null) {
if (userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -13,9 +13,8 @@ class MineController extends GetxController {
// 用户状态 动态、关注、粉丝
Rx<UserStat> userStat = UserStat().obs;
RxBool userLogin = false.obs;
Box user = GStrorage.user;
Box setting = GStrorage.setting;
Box userInfoCache = GStrorage.userInfo;
Box setting = GStrorage.setting;
Rx<ThemeType> themeType = ThemeType.system.obs;
@override
@ -24,6 +23,7 @@ class MineController extends GetxController {
if (userInfoCache.get('userInfoCache') != null) {
userInfo.value = userInfoCache.get('userInfoCache');
userLogin.value = true;
}
themeType.value = ThemeType.values[setting.get(SettingBoxKey.themeMode,
@ -41,8 +41,8 @@ class MineController extends GetxController {
},
);
} else {
int mid = user.get(UserBoxKey.userMid);
String face = user.get(UserBoxKey.userFace);
int mid = userInfo.value.mid!;
String face = userInfo.value.face!;
Get.toNamed(
'/member?mid=$mid',
arguments: {'face': face},
@ -51,7 +51,7 @@ class MineController extends GetxController {
}
Future queryUserInfo() async {
if (user.get(UserBoxKey.userLogin) == null) {
if (!userLogin.value) {
return {'status': false};
}
var res = await UserHttp.userInfo();
@ -59,18 +59,12 @@ class MineController extends GetxController {
if (res['data'].isLogin) {
userInfo.value = res['data'];
userInfoCache.put('userInfoCache', res['data']);
user.put(UserBoxKey.userName, res['data'].uname);
user.put(UserBoxKey.userFace, res['data'].face);
user.put(UserBoxKey.userMid, res['data'].mid);
user.put(UserBoxKey.userLogin, true);
userLogin.value = true;
// Get.find<MainController>().readuUserFace();
} else {
resetUserInfo();
}
} else {
resetUserInfo();
// SmartDialog.showToast(res['msg']);
}
await queryUserStatOwner();
return res;
@ -87,12 +81,8 @@ class MineController extends GetxController {
Future resetUserInfo() async {
userInfo.value = UserInfoData();
userStat.value = UserStat();
await user.delete(UserBoxKey.userName);
await user.delete(UserBoxKey.userFace);
await user.delete(UserBoxKey.userMid);
await user.delete(UserBoxKey.userLogin);
userInfoCache.delete('userInfoCache');
userLogin.value = false;
// Get.find<MainController>().resetLast();
}
onChangeTheme() {

View File

@ -11,19 +11,22 @@ import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
class SettingController extends GetxController {
Box user = GStrorage.user;
Box setting = GStrorage.setting;
Box userInfoCache = GStrorage.userInfo;
Box setting = GStrorage.setting;
// Box userInfoCache = GStrorage.userInfo;
Box localCache = GStrorage.localCache;
RxBool userLogin = false.obs;
RxBool feedBackEnable = false.obs;
RxInt picQuality = 10.obs;
Rx<ThemeType> themeType = ThemeType.system.obs;
var userInfo;
@override
void onInit() {
super.onInit();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
feedBackEnable.value =
setting.get(SettingBoxKey.feedBackEnable, defaultValue: false);
picQuality.value =
@ -53,7 +56,8 @@ class SettingController extends GetxController {
// 清空本地存储的用户标识
userInfoCache.put('userInfoCache', null);
user.put(UserBoxKey.accessKey, {'mid': -1, 'value': ''});
localCache
.put(LocalCacheKey.accessKey, {'mid': -1, 'value': ''});
// 更改我的页面登录状态
await Get.find<MineController>().resetUserInfo();

View File

@ -13,12 +13,14 @@ class PrivacySetting extends StatefulWidget {
class _PrivacySettingState extends State<PrivacySetting> {
bool userLogin = false;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
var userInfo;
@override
void initState() {
super.initState();
userLogin = user.get(UserBoxKey.userLogin) ?? false;
userInfo = userInfoCache.get('userInfoCache');
userLogin = userInfo != null;
}
@override

View File

@ -51,7 +51,7 @@ class VideoDetailController extends GetxController
RxBool enableHA = true.obs;
/// 本地存储
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
Box localCache = GStrorage.localCache;
Box setting = GStrorage.setting;
@ -70,11 +70,13 @@ class VideoDetailController extends GetxController
late Duration defaultST;
// 默认记录历史记录
bool enableHeart = true;
var userInfo;
@override
void onInit() {
super.onInit();
Map argMap = Get.arguments;
userInfo = userInfoCache.get('userInfoCache');
var keys = argMap.keys.toList();
if (keys.isNotEmpty) {
if (keys.contains('videoItem')) {
@ -92,7 +94,7 @@ class VideoDetailController extends GetxController
setting.get(SettingBoxKey.autoPlayEnable, defaultValue: true);
enableHA.value = setting.get(SettingBoxKey.enableHA, defaultValue: true);
if (user.get(UserBoxKey.userMid) == null ||
if (userInfo == null ||
localCache.get(LocalCacheKey.historyPause) == true) {
enableHeart = false;
}

View File

@ -42,7 +42,7 @@ class VideoIntroController extends GetxController {
RxBool hasCoin = false.obs;
// 是否收藏
RxBool hasFav = false.obs;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
bool userLogin = false;
Rx<FavFolderData> favFolderData = FavFolderData().obs;
List addMediaIdsNew = [];
@ -52,10 +52,12 @@ class VideoIntroController extends GetxController {
int _tempThemeValue = -1;
RxInt lastPlayCid = 0.obs;
var userInfo;
@override
void onInit() {
super.onInit();
userInfo = userInfoCache.get('userInfoCache');
if (Get.arguments.isNotEmpty) {
if (Get.arguments.containsKey('videoItem')) {
preRender = true;
@ -77,7 +79,7 @@ class VideoIntroController extends GetxController {
videoItem!['owner'] = args.owner;
}
}
userLogin = user.get(UserBoxKey.userLogin) != null;
userLogin = userInfo == null;
lastPlayCid.value = int.parse(Get.parameters['cid']!);
}
@ -143,7 +145,7 @@ class VideoIntroController extends GetxController {
// 一键三连
Future actionOneThree() async {
if (user.get(UserBoxKey.userMid) == null) {
if (userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}
@ -206,7 +208,7 @@ class VideoIntroController extends GetxController {
// 投币
Future actionCoinVideo() async {
if (user.get(UserBoxKey.userMid) == null) {
if (userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}
@ -302,7 +304,7 @@ class VideoIntroController extends GetxController {
Future queryVideoInFolder() async {
var result = await VideoHttp.videoInFolder(
mid: user.get(UserBoxKey.userMid), rid: IdUtils.bv2av(bvid));
mid: userInfo.mid, rid: IdUtils.bv2av(bvid));
if (result['status']) {
favFolderData.value = result['data'];
}
@ -337,7 +339,7 @@ class VideoIntroController extends GetxController {
// 关注/取关up
Future actionRelationMod() async {
feedBack();
if (user.get(UserBoxKey.userMid) == null) {
if (userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -127,7 +127,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
// 收藏
showFavBottomSheet() {
if (videoIntroController.user.get(UserBoxKey.userMid) == null) {
if (videoIntroController.userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -1,6 +1,7 @@
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
@ -14,7 +15,7 @@ import 'package:webview_flutter/webview_flutter.dart';
class WebviewController extends GetxController {
String url = '';
String type = '';
RxString type = ''.obs;
String pageTitle = '';
final WebViewController controller = WebViewController();
RxInt loadProgress = 0.obs;
@ -25,10 +26,10 @@ class WebviewController extends GetxController {
void onInit() {
super.onInit();
url = Get.parameters['url']!;
type = Get.parameters['type']!;
type.value = Get.parameters['type']!;
pageTitle = Get.parameters['pageTitle']!;
if (type == 'login') {
if (type.value == 'login') {
controller.clearCache();
controller.clearLocalStorage();
WebViewCookieManager().clearCookies();
@ -52,54 +53,11 @@ class WebviewController extends GetxController {
onUrlChange: (UrlChange urlChange) async {
loadShow.value = false;
String url = urlChange.url ?? '';
if (type == 'login' &&
if (type.value == 'login' &&
(url.startsWith(
'https://passport.bilibili.com/web/sso/exchange_cookie') ||
url.startsWith('https://m.bilibili.com/'))) {
try {
await SetCookie.onSet();
var result = await UserHttp.userInfo();
UserHttp.thirdLogin();
print('网页登录: $result');
if (result['status'] && result['data'].isLogin) {
SmartDialog.showToast('登录成功');
try {
Box user = GStrorage.user;
user.put(UserBoxKey.userLogin, true);
user.put(UserBoxKey.userName, result['data'].uname);
user.put(UserBoxKey.userFace, result['data'].face);
user.put(UserBoxKey.userMid, result['data'].mid);
Box userInfoCache = GStrorage.userInfo;
userInfoCache.put('userInfoCache', result['data']);
// 通知更新
eventBus.emit(EventName.loginEvent, {'status': true});
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(true);
} catch (err) {
SmartDialog.show(builder: (context) {
return AlertDialog(
title: const Text('登录遇到问题'),
content: Text(err.toString()),
actions: [
TextButton(
onPressed: () => controller.reload(),
child: const Text('确认'),
)
],
);
});
}
Get.back();
} else {
// 获取用户信息失败
SmartDialog.showToast(result.msg);
}
} catch (e) {
print(e);
}
confirmLogin(url);
}
},
onWebResourceError: (WebResourceError error) {},
@ -113,4 +71,51 @@ class WebviewController extends GetxController {
)
..loadRequest(Uri.parse(url));
}
confirmLogin(url) async {
var content = '';
if (url != null) {
content = '${content + url}; \n';
}
try {
await SetCookie.onSet();
var result = await UserHttp.userInfo();
UserHttp.thirdLogin();
if (result['status'] && result['data'].isLogin) {
SmartDialog.showToast('登录成功');
try {
Box userInfoCache = GStrorage.userInfo;
await userInfoCache.put('userInfoCache', result['data']);
// 通知更新
eventBus.emit(EventName.loginEvent, {'status': true});
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(true);
} catch (err) {
SmartDialog.show(builder: (context) {
return AlertDialog(
title: const Text('登录遇到问题'),
content: Text(err.toString()),
actions: [
TextButton(
onPressed: () => controller.reload(),
child: const Text('确认'),
)
],
);
});
}
Get.back();
} else {
// 获取用户信息失败
SmartDialog.showToast(result.msg);
Clipboard.setData(ClipboardData(text: result.msg.toString()));
}
} catch (e) {
SmartDialog.showNotify(msg: e.toString(), notifyType: NotifyType.warning);
content = content + e.toString();
}
Clipboard.setData(ClipboardData(text: content));
}
}

View File

@ -18,19 +18,25 @@ class _WebviewPageState extends State<WebviewPage> {
return Scaffold(
appBar: AppBar(
centerTitle: false,
titleSpacing: 0,
title: Text(
_webviewController.pageTitle,
style: Theme.of(context).textTheme.titleMedium,
),
actions: [
IconButton(
TextButton(
onPressed: () {
_webviewController.controller.reload();
},
icon: const Icon(
Icons.refresh,
size: 22,
),
child: const Text('刷新'),
),
Obx(
() => _webviewController.type.value == 'login'
? TextButton(
onPressed: () => _webviewController.confirmLogin(null),
child: const Text('刷新登录状态'),
)
: const SizedBox(),
),
const SizedBox(width: 10)
],
@ -48,6 +54,13 @@ class _WebviewPageState extends State<WebviewPage> {
),
),
),
Container(
width: double.infinity,
color: Theme.of(context).colorScheme.onInverseSurface,
padding:
const EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6),
child: const Text('登录成功未自动跳转? 请点击右上角「刷新登录状态」'),
),
Expanded(
child: WebViewWidget(controller: _webviewController.controller),
),