feat: 动态未读标记 issues #459
This commit is contained in:
9
lib/models/common/dynamic_badge_mode.dart
Normal file
9
lib/models/common/dynamic_badge_mode.dart
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
enum DynamicBadgeMode { hidden, point, number }
|
||||||
|
|
||||||
|
extension DynamicBadgeModeDesc on DynamicBadgeMode {
|
||||||
|
String get description => ['隐藏', '红点', '数字'][index];
|
||||||
|
}
|
||||||
|
|
||||||
|
extension DynamicBadgeModeCode on DynamicBadgeMode {
|
||||||
|
int get code => [0, 1, 2][index];
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@ import 'package:pilipala/pages/home/view.dart';
|
|||||||
import 'package:pilipala/pages/media/index.dart';
|
import 'package:pilipala/pages/media/index.dart';
|
||||||
import 'package:pilipala/utils/storage.dart';
|
import 'package:pilipala/utils/storage.dart';
|
||||||
import 'package:pilipala/utils/utils.dart';
|
import 'package:pilipala/utils/utils.dart';
|
||||||
|
import '../../models/common/dynamic_badge_mode.dart';
|
||||||
|
|
||||||
class MainController extends GetxController {
|
class MainController extends GetxController {
|
||||||
List<Widget> pages = <Widget>[
|
List<Widget> pages = <Widget>[
|
||||||
@ -65,6 +66,7 @@ class MainController extends GetxController {
|
|||||||
int selectedIndex = 0;
|
int selectedIndex = 0;
|
||||||
Box userInfoCache = GStrorage.userInfo;
|
Box userInfoCache = GStrorage.userInfo;
|
||||||
RxBool userLogin = false.obs;
|
RxBool userLogin = false.obs;
|
||||||
|
late Rx<DynamicBadgeMode> dynamicBadgeType = DynamicBadgeMode.number.obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@ -75,7 +77,12 @@ class MainController extends GetxController {
|
|||||||
hideTabBar = setting.get(SettingBoxKey.hideTabBar, defaultValue: true);
|
hideTabBar = setting.get(SettingBoxKey.hideTabBar, defaultValue: true);
|
||||||
var userInfo = userInfoCache.get('userInfoCache');
|
var userInfo = userInfoCache.get('userInfoCache');
|
||||||
userLogin.value = userInfo != null;
|
userLogin.value = userInfo != null;
|
||||||
getUnreadDynamic();
|
dynamicBadgeType.value = DynamicBadgeMode.values[setting.get(
|
||||||
|
SettingBoxKey.dynamicBadgeMode,
|
||||||
|
defaultValue: DynamicBadgeMode.number.code)];
|
||||||
|
if (dynamicBadgeType.value != DynamicBadgeMode.hidden) {
|
||||||
|
getUnreadDynamic();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onBackPressed(BuildContext context) {
|
void onBackPressed(BuildContext context) {
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import 'dart:async';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
|
import 'package:pilipala/models/common/dynamic_badge_mode.dart';
|
||||||
import 'package:pilipala/pages/dynamics/index.dart';
|
import 'package:pilipala/pages/dynamics/index.dart';
|
||||||
import 'package:pilipala/pages/home/index.dart';
|
import 'package:pilipala/pages/home/index.dart';
|
||||||
import 'package:pilipala/pages/media/index.dart';
|
import 'package:pilipala/pages/media/index.dart';
|
||||||
@ -127,11 +128,21 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
|
|||||||
destinations: <Widget>[
|
destinations: <Widget>[
|
||||||
..._mainController.navigationBars.map((e) {
|
..._mainController.navigationBars.map((e) {
|
||||||
return NavigationDestination(
|
return NavigationDestination(
|
||||||
icon: Badge(
|
icon: Obx(
|
||||||
label: Text(e['count'].toString()),
|
() => Badge(
|
||||||
padding: const EdgeInsets.fromLTRB(6, 0, 6, 0),
|
label:
|
||||||
isLabelVisible: e['count'] > 0,
|
_mainController.dynamicBadgeType.value ==
|
||||||
child: e['icon'],
|
DynamicBadgeMode.number
|
||||||
|
? Text(e['count'].toString())
|
||||||
|
: null,
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.fromLTRB(6, 0, 6, 0),
|
||||||
|
isLabelVisible:
|
||||||
|
_mainController.dynamicBadgeType.value !=
|
||||||
|
DynamicBadgeMode.hidden &&
|
||||||
|
e['count'] > 0,
|
||||||
|
child: e['icon'],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
selectedIcon: e['selectIcon'],
|
selectedIcon: e['selectIcon'],
|
||||||
label: e['label'],
|
label: e['label'],
|
||||||
@ -148,11 +159,21 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
|
|||||||
items: [
|
items: [
|
||||||
..._mainController.navigationBars.map((e) {
|
..._mainController.navigationBars.map((e) {
|
||||||
return BottomNavigationBarItem(
|
return BottomNavigationBarItem(
|
||||||
icon: Badge(
|
icon: Obx(
|
||||||
label: Text(e['count'].toString()),
|
() => Badge(
|
||||||
padding: const EdgeInsets.fromLTRB(6, 0, 6, 0),
|
label:
|
||||||
isLabelVisible: e['count'] > 0,
|
_mainController.dynamicBadgeType.value ==
|
||||||
child: e['icon'],
|
DynamicBadgeMode.number
|
||||||
|
? Text(e['count'].toString())
|
||||||
|
: null,
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.fromLTRB(6, 0, 6, 0),
|
||||||
|
isLabelVisible:
|
||||||
|
_mainController.dynamicBadgeType.value !=
|
||||||
|
DynamicBadgeMode.hidden &&
|
||||||
|
e['count'] > 0,
|
||||||
|
child: e['icon'],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
activeIcon: e['selectIcon'],
|
activeIcon: e['selectIcon'],
|
||||||
label: e['label'],
|
label: e['label'],
|
||||||
|
|||||||
@ -7,6 +7,9 @@ import 'package:pilipala/models/common/theme_type.dart';
|
|||||||
import 'package:pilipala/utils/feed_back.dart';
|
import 'package:pilipala/utils/feed_back.dart';
|
||||||
import 'package:pilipala/utils/login.dart';
|
import 'package:pilipala/utils/login.dart';
|
||||||
import 'package:pilipala/utils/storage.dart';
|
import 'package:pilipala/utils/storage.dart';
|
||||||
|
import '../../models/common/dynamic_badge_mode.dart';
|
||||||
|
import '../main/index.dart';
|
||||||
|
import 'widgets/select_dialog.dart';
|
||||||
|
|
||||||
class SettingController extends GetxController {
|
class SettingController extends GetxController {
|
||||||
Box userInfoCache = GStrorage.userInfo;
|
Box userInfoCache = GStrorage.userInfo;
|
||||||
@ -19,6 +22,7 @@ class SettingController extends GetxController {
|
|||||||
RxInt picQuality = 10.obs;
|
RxInt picQuality = 10.obs;
|
||||||
Rx<ThemeType> themeType = ThemeType.system.obs;
|
Rx<ThemeType> themeType = ThemeType.system.obs;
|
||||||
var userInfo;
|
var userInfo;
|
||||||
|
Rx<DynamicBadgeMode> dynamicBadgeType = DynamicBadgeMode.number.obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@ -33,6 +37,9 @@ class SettingController extends GetxController {
|
|||||||
setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10);
|
setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10);
|
||||||
themeType.value = ThemeType.values[setting.get(SettingBoxKey.themeMode,
|
themeType.value = ThemeType.values[setting.get(SettingBoxKey.themeMode,
|
||||||
defaultValue: ThemeType.system.code)];
|
defaultValue: ThemeType.system.code)];
|
||||||
|
dynamicBadgeType.value = DynamicBadgeMode.values[setting.get(
|
||||||
|
SettingBoxKey.dynamicBadgeMode,
|
||||||
|
defaultValue: DynamicBadgeMode.number.code)];
|
||||||
}
|
}
|
||||||
|
|
||||||
loginOut() async {
|
loginOut() async {
|
||||||
@ -76,4 +83,31 @@ class SettingController extends GetxController {
|
|||||||
feedBackEnable.value = !feedBackEnable.value;
|
feedBackEnable.value = !feedBackEnable.value;
|
||||||
setting.put(SettingBoxKey.feedBackEnable, feedBackEnable.value);
|
setting.put(SettingBoxKey.feedBackEnable, feedBackEnable.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置动态未读标记
|
||||||
|
setDynamicBadgeMode(BuildContext context) async {
|
||||||
|
DynamicBadgeMode? result = await showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return SelectDialog<DynamicBadgeMode>(
|
||||||
|
title: '动态未读标记',
|
||||||
|
value: dynamicBadgeType.value,
|
||||||
|
values: DynamicBadgeMode.values.map((e) {
|
||||||
|
return {'title': e.description, 'value': e};
|
||||||
|
}).toList(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (result != null) {
|
||||||
|
dynamicBadgeType.value = result;
|
||||||
|
setting.put(SettingBoxKey.dynamicBadgeMode, result.code);
|
||||||
|
MainController mainController = Get.put(MainController());
|
||||||
|
mainController.dynamicBadgeType.value =
|
||||||
|
DynamicBadgeMode.values[result.code];
|
||||||
|
if (mainController.dynamicBadgeType.value != DynamicBadgeMode.hidden) {
|
||||||
|
mainController.getUnreadDynamic();
|
||||||
|
}
|
||||||
|
SmartDialog.showToast('设置成功');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import 'package:pilipala/pages/setting/widgets/select_dialog.dart';
|
|||||||
import 'package:pilipala/pages/setting/widgets/slide_dialog.dart';
|
import 'package:pilipala/pages/setting/widgets/slide_dialog.dart';
|
||||||
import 'package:pilipala/utils/storage.dart';
|
import 'package:pilipala/utils/storage.dart';
|
||||||
|
|
||||||
|
import '../../models/common/dynamic_badge_mode.dart';
|
||||||
import 'controller.dart';
|
import 'controller.dart';
|
||||||
import 'widgets/switch_item.dart';
|
import 'widgets/switch_item.dart';
|
||||||
|
|
||||||
@ -241,6 +242,14 @@ class _StyleSettingState extends State<StyleSetting> {
|
|||||||
'当前模式:${settingController.themeType.value.description}',
|
'当前模式:${settingController.themeType.value.description}',
|
||||||
style: subTitleStyle)),
|
style: subTitleStyle)),
|
||||||
),
|
),
|
||||||
|
ListTile(
|
||||||
|
dense: false,
|
||||||
|
onTap: () => settingController.setDynamicBadgeMode(context),
|
||||||
|
title: Text('动态未读标记', style: titleStyle),
|
||||||
|
subtitle: Obx(() => Text(
|
||||||
|
'当前标记样式:${settingController.dynamicBadgeType.value.description}',
|
||||||
|
style: subTitleStyle)),
|
||||||
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
dense: false,
|
dense: false,
|
||||||
onTap: () => Get.toNamed('/colorSetting'),
|
onTap: () => Get.toNamed('/colorSetting'),
|
||||||
|
|||||||
@ -130,7 +130,8 @@ class SettingBoxKey {
|
|||||||
enableMYBar = 'enableMYBar',
|
enableMYBar = 'enableMYBar',
|
||||||
hideSearchBar = 'hideSearchBar', // 收起顶栏
|
hideSearchBar = 'hideSearchBar', // 收起顶栏
|
||||||
hideTabBar = 'hideTabBar', // 收起底栏
|
hideTabBar = 'hideTabBar', // 收起底栏
|
||||||
tabbarSort = 'tabbarSort'; // 首页tabbar
|
tabbarSort = 'tabbarSort', // 首页tabbar
|
||||||
|
dynamicBadgeMode = 'dynamicBadgeMode';
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalCacheKey {
|
class LocalCacheKey {
|
||||||
|
|||||||
Reference in New Issue
Block a user