mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
mod: handle dispose
This commit is contained in:
@@ -33,6 +33,7 @@ class AnimatedDialogState extends State<AnimatedDialog>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller!.removeListener(() {});
|
||||
controller!.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ class _BangumiPageState extends State<BangumiPage>
|
||||
final BangumiController _bangumiController = Get.put(BangumiController());
|
||||
late Future? _futureBuilderFuture;
|
||||
late Future? _futureBuilderFutureFollow;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
@@ -34,17 +33,17 @@ class _BangumiPageState extends State<BangumiPage>
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
scrollController = _bangumiController.scrollController;
|
||||
StreamController<bool> mainStream =
|
||||
Get.find<MainController>().bottomBarStream;
|
||||
StreamController<bool> searchBarStream =
|
||||
Get.find<HomeController>().searchBarStream;
|
||||
_futureBuilderFuture = _bangumiController.queryBangumiListFeed();
|
||||
_futureBuilderFutureFollow = _bangumiController.queryBangumiFollow();
|
||||
scrollController.addListener(
|
||||
_bangumiController.scrollController.addListener(
|
||||
() async {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_bangumiController.scrollController.position.pixels >=
|
||||
_bangumiController.scrollController.position.maxScrollExtent -
|
||||
200) {
|
||||
EasyThrottle.throttle('my-throttler', const Duration(seconds: 1), () {
|
||||
_bangumiController.isLoadingMore = true;
|
||||
_bangumiController.onLoad();
|
||||
@@ -52,7 +51,7 @@ class _BangumiPageState extends State<BangumiPage>
|
||||
}
|
||||
|
||||
final ScrollDirection direction =
|
||||
scrollController.position.userScrollDirection;
|
||||
_bangumiController.scrollController.position.userScrollDirection;
|
||||
if (direction == ScrollDirection.forward) {
|
||||
mainStream.add(true);
|
||||
searchBarStream.add(true);
|
||||
@@ -66,7 +65,8 @@ class _BangumiPageState extends State<BangumiPage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
_bangumiController.scrollController.removeListener(() {});
|
||||
_bangumiController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ class _BlackListPageState extends State<BlackListPage> {
|
||||
_blackListController.blackList.map<int>((e) => e.mid!).toList();
|
||||
localCache.put(LocalCacheKey.blackMidsList, blackMidsList);
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -182,8 +182,9 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
titleStreamC.close();
|
||||
fabAnimationCtr.dispose();
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
final DynamicsController _dynamicsController = Get.put(DynamicsController());
|
||||
late Future _futureBuilderFutureUp;
|
||||
Box userInfoCache = GStorage.userInfo;
|
||||
late ScrollController scrollController;
|
||||
late UpPanelPosition upPanelPosition;
|
||||
|
||||
@override
|
||||
@@ -57,12 +56,12 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
SettingBoxKey.upPanelPosition,
|
||||
defaultValue: UpPanelPosition.leftFixed.code)];
|
||||
print('upPanelPosition: $upPanelPosition');
|
||||
scrollController = _dynamicsController.scrollController;
|
||||
if (GStorage.setting
|
||||
.get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) {
|
||||
scrollController.addListener(() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
_dynamicsController.scrollController.addListener(() {
|
||||
if (_dynamicsController.scrollController.position.pixels >=
|
||||
_dynamicsController.scrollController.position.maxScrollExtent -
|
||||
300) {
|
||||
EasyThrottle.throttle('following', const Duration(seconds: 1), () {
|
||||
_dynamicsController.queryFollowing2();
|
||||
});
|
||||
@@ -75,6 +74,8 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
void dispose() {
|
||||
_dynamicsController.tabController.removeListener(() {});
|
||||
_dynamicsController.tabController.dispose();
|
||||
_dynamicsController.scrollController.removeListener(() {});
|
||||
_dynamicsController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -96,8 +97,8 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
}
|
||||
Map data = snapshot.data;
|
||||
if (data['status']) {
|
||||
return Obx(() => UpPanel(
|
||||
_dynamicsController.upData.value, scrollController));
|
||||
return Obx(() => UpPanel(_dynamicsController.upData.value,
|
||||
_dynamicsController.scrollController));
|
||||
} else {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ class _FansPageState extends State<FansPage> {
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,13 @@ class _FavPageState extends State<FavPage> {
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@@ -54,6 +54,8 @@ class _FavDetailPageState extends State<FavDetailPage> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
titleStreamC.close();
|
||||
_controller.removeListener(() {});
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -16,18 +16,16 @@ class FavSearchPage extends StatefulWidget {
|
||||
|
||||
class _FavSearchPageState extends State<FavSearchPage> {
|
||||
final FavSearchController _favSearchCtr = Get.put(FavSearchController());
|
||||
late ScrollController scrollController;
|
||||
late int searchType;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
searchType = int.parse(Get.parameters['searchType']!);
|
||||
scrollController = _favSearchCtr.scrollController;
|
||||
scrollController.addListener(
|
||||
_favSearchCtr.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
if (_favSearchCtr.scrollController.position.pixels >=
|
||||
_favSearchCtr.scrollController.position.maxScrollExtent - 300) {
|
||||
EasyThrottle.throttle('fav', const Duration(seconds: 1), () {
|
||||
_favSearchCtr.onLoad();
|
||||
});
|
||||
@@ -38,8 +36,9 @@ class _FavSearchPageState extends State<FavSearchPage> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
_favSearchCtr.searchFocusNode.dispose();
|
||||
_favSearchCtr.scrollController.removeListener(() {});
|
||||
_favSearchCtr.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -86,7 +85,7 @@ class _FavSearchPageState extends State<FavSearchPage> {
|
||||
)
|
||||
: _favSearchCtr.favList.isNotEmpty
|
||||
? ListView.builder(
|
||||
controller: scrollController,
|
||||
controller: _favSearchCtr.scrollController,
|
||||
itemCount: _favSearchCtr.favList.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
if (index == _favSearchCtr.favList.length) {
|
||||
|
||||
@@ -14,7 +14,6 @@ class FollowPage extends StatefulWidget {
|
||||
class _FollowPageState extends State<FollowPage> {
|
||||
late String mid;
|
||||
late FollowController _followController;
|
||||
final ScrollController scrollController = ScrollController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -39,10 +38,9 @@ class _FollowPageState extends State<FollowPage> {
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () => Get.toNamed('/followSearch?mid=$mid'),
|
||||
icon: const Icon(Icons.search_outlined),
|
||||
tooltip: '搜索'
|
||||
),
|
||||
onPressed: () => Get.toNamed('/followSearch?mid=$mid'),
|
||||
icon: const Icon(Icons.search_outlined),
|
||||
tooltip: '搜索'),
|
||||
PopupMenuButton(
|
||||
icon: const Icon(Icons.more_vert),
|
||||
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPalaX/common/widgets/http_error.dart';
|
||||
@@ -20,6 +19,14 @@ class _FollowSearchPageState extends State<FollowSearchPage> {
|
||||
late Future? _futureBuilder;
|
||||
final ScrollController scrollController = ScrollController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_followSearchController.searchFocusNode.dispose();
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
@@ -61,6 +61,7 @@ class _HistoryPageState extends State<HistoryPage> {
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -116,6 +116,12 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
tabController.animation!.removeListener(() {});
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void searchDefault() async {
|
||||
var res = await Request().get(Api.searchDefault);
|
||||
if (res.data['code'] == 0) {
|
||||
|
||||
@@ -26,7 +26,6 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
|
||||
final HotController _hotController = Get.put(HotController());
|
||||
List videoList = [];
|
||||
Future? _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
@@ -35,15 +34,14 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
|
||||
void initState() {
|
||||
super.initState();
|
||||
_futureBuilderFuture = _hotController.queryHotFeed('init');
|
||||
scrollController = _hotController.scrollController;
|
||||
StreamController<bool> mainStream =
|
||||
Get.find<MainController>().bottomBarStream;
|
||||
StreamController<bool> searchBarStream =
|
||||
Get.find<HomeController>().searchBarStream;
|
||||
scrollController.addListener(
|
||||
_hotController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_hotController.scrollController.position.pixels >=
|
||||
_hotController.scrollController.position.maxScrollExtent - 200) {
|
||||
if (!_hotController.isLoadingMore) {
|
||||
_hotController.isLoadingMore = true;
|
||||
_hotController.onLoad();
|
||||
@@ -51,7 +49,7 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
|
||||
}
|
||||
|
||||
final ScrollDirection direction =
|
||||
scrollController.position.userScrollDirection;
|
||||
_hotController.scrollController.position.userScrollDirection;
|
||||
if (direction == ScrollDirection.forward) {
|
||||
mainStream.add(true);
|
||||
searchBarStream.add(true);
|
||||
@@ -65,7 +63,8 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
_hotController.scrollController.removeListener(() {});
|
||||
_hotController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,14 @@ class _HtmlRenderPageState extends State<HtmlRenderPage>
|
||||
scrollListener();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
fabAnimationCtr.dispose();
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void scrollListener() {
|
||||
scrollController = _htmlRenderCtr.scrollController;
|
||||
scrollController.addListener(
|
||||
|
||||
@@ -27,7 +27,6 @@ class _LivePageState extends State<LivePage>
|
||||
with AutomaticKeepAliveClientMixin {
|
||||
final LiveController _liveController = Get.put(LiveController());
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
@@ -36,15 +35,14 @@ class _LivePageState extends State<LivePage>
|
||||
void initState() {
|
||||
super.initState();
|
||||
_futureBuilderFuture = _liveController.queryLiveList('init');
|
||||
scrollController = _liveController.scrollController;
|
||||
StreamController<bool> mainStream =
|
||||
Get.find<MainController>().bottomBarStream;
|
||||
StreamController<bool> searchBarStream =
|
||||
Get.find<HomeController>().searchBarStream;
|
||||
scrollController.addListener(
|
||||
_liveController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_liveController.scrollController.position.pixels >=
|
||||
_liveController.scrollController.position.maxScrollExtent - 200) {
|
||||
EasyThrottle.throttle('liveList', const Duration(milliseconds: 200),
|
||||
() {
|
||||
_liveController.onLoad();
|
||||
@@ -52,7 +50,7 @@ class _LivePageState extends State<LivePage>
|
||||
}
|
||||
|
||||
final ScrollDirection direction =
|
||||
scrollController.position.userScrollDirection;
|
||||
_liveController.scrollController.position.userScrollDirection;
|
||||
if (direction == ScrollDirection.forward) {
|
||||
mainStream.add(true);
|
||||
searchBarStream.add(true);
|
||||
@@ -66,7 +64,8 @@ class _LivePageState extends State<LivePage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
_liveController.scrollController.removeListener(() {});
|
||||
_liveController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
|
||||
@override
|
||||
void dispose() {
|
||||
floating?.dispose();
|
||||
plPlayerController!.dispose();
|
||||
plPlayerController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -176,7 +176,7 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
|
||||
),
|
||||
//内置浏览器打开
|
||||
IconButton(
|
||||
tooltip: '内置浏览器打开',
|
||||
tooltip: '内置浏览器打开',
|
||||
onPressed: () {
|
||||
Get.offNamed(
|
||||
'/webview',
|
||||
|
||||
@@ -326,14 +326,13 @@ class LoginPageController extends GetxController
|
||||
String captchaKey = '';
|
||||
Get.dialog(AlertDialog(
|
||||
title: const Text("本次登录需要验证您的手机号"),
|
||||
content: Column(
|
||||
children:[
|
||||
Text(accountInfo['hindTel'] ?? '未能获取手机号'),
|
||||
TextField(
|
||||
controller: _textFieldController,
|
||||
decoration: const InputDecoration(hintText: "请输入短信验证码"),
|
||||
),]),
|
||||
|
||||
content: Column(children: [
|
||||
Text(accountInfo['hindTel'] ?? '未能获取手机号'),
|
||||
TextField(
|
||||
controller: _textFieldController,
|
||||
decoration: const InputDecoration(hintText: "请输入短信验证码"),
|
||||
),
|
||||
]),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text("发送验证码 "),
|
||||
@@ -349,12 +348,13 @@ class LoginPageController extends GetxController
|
||||
captchaData.token = preCaptureRes['data']['recaptcha_token']!;
|
||||
|
||||
getCaptcha(geeGt, geeChallenge, () async {
|
||||
var safeCenterSendSmsCodeRes = await LoginHttp.safeCenterSmsCode(
|
||||
tmpCode: currentUri.queryParameters['tmp_token']!,
|
||||
geeChallenge: geeChallenge,
|
||||
geeSeccode: captchaData.seccode!,
|
||||
geeValidate: captchaData.validate!,
|
||||
recaptchaToken: captchaData.token!);
|
||||
var safeCenterSendSmsCodeRes =
|
||||
await LoginHttp.safeCenterSmsCode(
|
||||
tmpCode: currentUri.queryParameters['tmp_token']!,
|
||||
geeChallenge: geeChallenge,
|
||||
geeSeccode: captchaData.seccode!,
|
||||
geeValidate: captchaData.validate!,
|
||||
recaptchaToken: captchaData.token!);
|
||||
if (!safeCenterSendSmsCodeRes['status']) {
|
||||
SmartDialog.showToast("发送短信验证码失败,请尝试其它登录方式\n"
|
||||
"(${safeCenterSendSmsCodeRes['code']}) ${safeCenterSendSmsCodeRes['msg']}");
|
||||
@@ -376,12 +376,13 @@ class LoginPageController extends GetxController
|
||||
SmartDialog.showToast("请输入短信验证码");
|
||||
return;
|
||||
}
|
||||
var safeCenterSmsVerifyRes = await LoginHttp.safeCenterSmsVerify(
|
||||
code: code,
|
||||
tmpCode: currentUri.queryParameters['tmp_token']!,
|
||||
requestId: currentUri.queryParameters['request_id']!,
|
||||
source: currentUri.queryParameters['source']!,
|
||||
captchaKey: captchaKey,
|
||||
var safeCenterSmsVerifyRes =
|
||||
await LoginHttp.safeCenterSmsVerify(
|
||||
code: code,
|
||||
tmpCode: currentUri.queryParameters['tmp_token']!,
|
||||
requestId: currentUri.queryParameters['request_id']!,
|
||||
source: currentUri.queryParameters['source']!,
|
||||
captchaKey: captchaKey,
|
||||
);
|
||||
if (!safeCenterSmsVerifyRes['status']) {
|
||||
SmartDialog.showToast("验证短信验证码失败,请尝试其它登录方式\n"
|
||||
@@ -396,7 +397,6 @@ class LoginPageController extends GetxController
|
||||
],
|
||||
));
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
if (data['token_info'] == null || data['cookie_info'] == null) {
|
||||
|
||||
@@ -25,6 +25,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
// 二维码生成时间
|
||||
bool showPassword = false;
|
||||
GlobalKey globalKey = GlobalKey();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -33,6 +34,10 @@ class _LoginPageState extends State<LoginPage> {
|
||||
@override
|
||||
void dispose() {
|
||||
_loginPageCtr.dispose();
|
||||
_loginPageCtr.telTextController.dispose();
|
||||
_loginPageCtr.usernameTextController.dispose();
|
||||
_loginPageCtr.passwordTextController.dispose();
|
||||
_loginPageCtr.smsCodeTextController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ class _MediaPageState extends State<MediaPage>
|
||||
@override
|
||||
void dispose() {
|
||||
mediaController.scrollController.removeListener(() {});
|
||||
mediaController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -18,9 +18,15 @@ class MemberArchivePage extends StatefulWidget {
|
||||
class _MemberArchivePageState extends State<MemberArchivePage> {
|
||||
late MemberArchiveController _memberArchivesController;
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
late int mid;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_memberArchivesController.scrollController.removeListener(() {});
|
||||
_memberArchivesController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -29,11 +35,12 @@ class _MemberArchivePageState extends State<MemberArchivePage> {
|
||||
_memberArchivesController =
|
||||
Get.put(MemberArchiveController(), tag: heroTag);
|
||||
_futureBuilderFuture = _memberArchivesController.getMemberArchive('init');
|
||||
scrollController = _memberArchivesController.scrollController;
|
||||
scrollController.addListener(
|
||||
_memberArchivesController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_memberArchivesController.scrollController.position.pixels >=
|
||||
_memberArchivesController
|
||||
.scrollController.position.maxScrollExtent -
|
||||
200) {
|
||||
EasyThrottle.throttle(
|
||||
'member_archives', const Duration(milliseconds: 500), () {
|
||||
_memberArchivesController.onLoad();
|
||||
|
||||
@@ -21,7 +21,6 @@ class MemberDynamicsPage extends StatefulWidget {
|
||||
class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
|
||||
late MemberDynamicsController _memberDynamicController;
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
late int mid;
|
||||
late bool dynamicsWaterfallFlow;
|
||||
|
||||
@@ -34,11 +33,11 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
|
||||
Get.put(MemberDynamicsController(), tag: heroTag);
|
||||
_futureBuilderFuture =
|
||||
_memberDynamicController.getMemberDynamic('onRefresh');
|
||||
scrollController = _memberDynamicController.scrollController;
|
||||
scrollController.addListener(
|
||||
_memberDynamicController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_memberDynamicController.scrollController.position.pixels >=
|
||||
_memberDynamicController.scrollController.position.maxScrollExtent -
|
||||
200) {
|
||||
EasyThrottle.throttle(
|
||||
'member_dynamics', const Duration(milliseconds: 1000), () {
|
||||
_memberDynamicController.onLoad();
|
||||
@@ -53,6 +52,7 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
|
||||
@override
|
||||
void dispose() {
|
||||
_memberDynamicController.scrollController.removeListener(() {});
|
||||
_memberDynamicController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,9 @@ class _MemberSearchPageState extends State<MemberSearchPage>
|
||||
@override
|
||||
void dispose() {
|
||||
// _tabController.dispose();
|
||||
_memberSearchCtr.searchFocusNode.dispose();
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,18 +17,24 @@ class _MemberSeasonsPageState extends State<MemberSeasonsPage> {
|
||||
final MemberSeasonsController _memberSeasonsController =
|
||||
Get.put(MemberSeasonsController());
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_memberSeasonsController.scrollController.removeListener(() {});
|
||||
_memberSeasonsController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_futureBuilderFuture =
|
||||
_memberSeasonsController.getSeasonDetail('onRefresh');
|
||||
scrollController = _memberSeasonsController.scrollController;
|
||||
scrollController.addListener(
|
||||
_memberSeasonsController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_memberSeasonsController.scrollController.position.pixels >=
|
||||
_memberSeasonsController.scrollController.position.maxScrollExtent -
|
||||
200) {
|
||||
EasyThrottle.throttle(
|
||||
'member_archives', const Duration(milliseconds: 500), () {
|
||||
_memberSeasonsController.onLoad();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPalaX/common/constants.dart';
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPalaX/common/widgets/network_img_layer.dart';
|
||||
|
||||
@@ -25,6 +24,13 @@ class _AtMePageState extends State<AtMePage> {
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_scrollListener);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future _scrollListener() async {
|
||||
if (_scrollController.position.pixels >=
|
||||
_scrollController.position.maxScrollExtent - 200) {
|
||||
@@ -63,8 +69,8 @@ class _AtMePageState extends State<AtMePage> {
|
||||
itemBuilder: (_, int i) {
|
||||
return ListTile(
|
||||
onTap: () {
|
||||
String? nativeUri = _atMeController
|
||||
.msgFeedAtMeList[i].item?.nativeUri;
|
||||
String? nativeUri =
|
||||
_atMeController.msgFeedAtMeList[i].item?.nativeUri;
|
||||
if (nativeUri != null) {
|
||||
PiliScheme.routePush(Uri.parse(nativeUri));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPalaX/common/widgets/network_img_layer.dart';
|
||||
|
||||
@@ -26,6 +25,13 @@ class _LikeMePageState extends State<LikeMePage> {
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_scrollListener);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future _scrollListener() async {
|
||||
if (_scrollController.position.pixels >=
|
||||
_scrollController.position.maxScrollExtent - 200) {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPalaX/common/widgets/network_img_layer.dart';
|
||||
|
||||
@@ -26,6 +25,13 @@ class _ReplyMePageState extends State<ReplyMePage> {
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_scrollListener);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future _scrollListener() async {
|
||||
if (_scrollController.position.pixels >=
|
||||
_scrollController.position.maxScrollExtent - 200) {
|
||||
|
||||
@@ -24,6 +24,13 @@ class _SysMsgPageState extends State<SysMsgPage> {
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_scrollListener);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future _scrollListener() async {
|
||||
if (_scrollController.position.pixels >=
|
||||
_scrollController.position.maxScrollExtent - 200) {
|
||||
@@ -60,7 +67,8 @@ class _SysMsgPageState extends State<SysMsgPage> {
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemBuilder: (_, int i) {
|
||||
String? content = _sysMsgController.msgFeedSysMsgList[i].content;
|
||||
String? content =
|
||||
_sysMsgController.msgFeedSysMsgList[i].content;
|
||||
if (content != null) {
|
||||
try {
|
||||
dynamic jsonContent = json.decode(content);
|
||||
@@ -73,36 +81,38 @@ class _SysMsgPageState extends State<SysMsgPage> {
|
||||
onTap: () {},
|
||||
title: Text(
|
||||
"${_sysMsgController.msgFeedSysMsgList[i].title}",
|
||||
style: Theme.of(context).textTheme.titleMedium!.copyWith(
|
||||
color: Theme.of(context).colorScheme.primary
|
||||
),
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
color: Theme.of(context).colorScheme.primary),
|
||||
),
|
||||
subtitle: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(height: 4),
|
||||
SelectableText(
|
||||
"$content",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.outline)),
|
||||
SelectableText("$content",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.outline)),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
"${_sysMsgController.msgFeedSysMsgList[i].timeAt}",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.outline.withOpacity(0.8))),
|
||||
]));
|
||||
Text(
|
||||
"${_sysMsgController.msgFeedSysMsgList[i].timeAt}",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.outline
|
||||
.withOpacity(0.8))),
|
||||
]));
|
||||
},
|
||||
separatorBuilder: (BuildContext context, int index) {
|
||||
return Divider(
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dismissible_page/dismissible_page.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
@@ -28,7 +28,6 @@ class _ZonePageState extends State<ZonePage>
|
||||
with AutomaticKeepAliveClientMixin {
|
||||
late ZoneController _zoneController;
|
||||
Future? _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
@@ -38,15 +37,14 @@ class _ZonePageState extends State<ZonePage>
|
||||
super.initState();
|
||||
_zoneController = Get.put(ZoneController(), tag: widget.rid.toString());
|
||||
_futureBuilderFuture = _zoneController.queryRankFeed('init', widget.rid);
|
||||
scrollController = _zoneController.scrollController;
|
||||
StreamController<bool> mainStream =
|
||||
Get.find<MainController>().bottomBarStream;
|
||||
StreamController<bool> searchBarStream =
|
||||
Get.find<HomeController>().searchBarStream;
|
||||
scrollController.addListener(
|
||||
_zoneController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 200) {
|
||||
if (_zoneController.scrollController.position.pixels >=
|
||||
_zoneController.scrollController.position.maxScrollExtent - 200) {
|
||||
if (!_zoneController.isLoadingMore) {
|
||||
_zoneController.isLoadingMore = true;
|
||||
_zoneController.onLoad();
|
||||
@@ -54,7 +52,7 @@ class _ZonePageState extends State<ZonePage>
|
||||
}
|
||||
|
||||
final ScrollDirection direction =
|
||||
scrollController.position.userScrollDirection;
|
||||
_zoneController.scrollController.position.userScrollDirection;
|
||||
if (direction == ScrollDirection.forward) {
|
||||
mainStream.add(true);
|
||||
searchBarStream.add(true);
|
||||
@@ -68,7 +66,8 @@ class _ZonePageState extends State<ZonePage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
_zoneController.scrollController.removeListener(() {});
|
||||
_zoneController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -80,12 +79,12 @@ class _ZonePageState extends State<ZonePage>
|
||||
return await _zoneController.onRefresh();
|
||||
},
|
||||
child: CustomScrollView(
|
||||
controller: scrollController,
|
||||
controller: _zoneController.scrollController,
|
||||
slivers: [
|
||||
SliverPadding(
|
||||
// 单列布局 EdgeInsets.zero
|
||||
padding:
|
||||
const EdgeInsets.fromLTRB(StyleString.cardSpace, StyleString.safeSpace, 0, 0),
|
||||
padding: const EdgeInsets.fromLTRB(
|
||||
StyleString.cardSpace, StyleString.safeSpace, 0, 0),
|
||||
sliver: FutureBuilder(
|
||||
future: _futureBuilderFuture,
|
||||
builder: (context, snapshot) {
|
||||
|
||||
@@ -65,6 +65,7 @@ class _RcmdPageState extends State<RcmdPage>
|
||||
@override
|
||||
void dispose() {
|
||||
_rcmdController.scrollController.removeListener(() {});
|
||||
_rcmdController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,12 @@ class _SearchPageState extends State<SearchPage> with RouteAware {
|
||||
_futureBuilderFuture = _searchController.queryHotSearchList();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_searchController.searchFocusNode.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
// 返回当前页面时
|
||||
void didPopNext() async {
|
||||
|
||||
@@ -32,7 +32,6 @@ class _SearchPanelState extends State<SearchPanel>
|
||||
late SearchPanelController _searchPanelController;
|
||||
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
@@ -47,10 +46,10 @@ class _SearchPanelState extends State<SearchPanel>
|
||||
),
|
||||
tag: widget.searchType!.type + widget.keyword!,
|
||||
);
|
||||
scrollController = _searchPanelController.scrollController;
|
||||
scrollController.addListener(() async {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 100) {
|
||||
_searchPanelController.scrollController.addListener(() async {
|
||||
if (_searchPanelController.scrollController.position.pixels >=
|
||||
_searchPanelController.scrollController.position.maxScrollExtent -
|
||||
100) {
|
||||
EasyThrottle.throttle('history', const Duration(seconds: 1), () {
|
||||
_searchPanelController.onSearch(type: 'onLoad');
|
||||
});
|
||||
@@ -61,7 +60,8 @@ class _SearchPanelState extends State<SearchPanel>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
scrollController.removeListener(() {});
|
||||
_searchPanelController.scrollController.removeListener(() {});
|
||||
_searchPanelController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class SearchResultPage extends StatefulWidget {
|
||||
class _SearchResultPageState extends State<SearchResultPage>
|
||||
with TickerProviderStateMixin {
|
||||
late SearchResultController? _searchResultController;
|
||||
late TabController? _tabController;
|
||||
late TabController _tabController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -29,6 +29,12 @@ class _SearchResultPageState extends State<SearchResultPage>
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@@ -32,6 +32,13 @@ class _SetDisplayModeState extends State<SetDisplayMode> {
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller.removeListener(() {});
|
||||
controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
// 获取所有的mode
|
||||
Future<void> fetchAll() async {
|
||||
preferred = await FlutterDisplayMode.preferred;
|
||||
|
||||
@@ -17,17 +17,22 @@ class SubPage extends StatefulWidget {
|
||||
class _SubPageState extends State<SubPage> {
|
||||
final SubController _subController = Get.put(SubController());
|
||||
late Future _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_subController.scrollController.removeListener(() {});
|
||||
_subController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_futureBuilderFuture = _subController.querySubFolder();
|
||||
scrollController = _subController.scrollController;
|
||||
scrollController.addListener(
|
||||
_subController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
if (_subController.scrollController.position.pixels >=
|
||||
_subController.scrollController.position.maxScrollExtent - 300) {
|
||||
EasyThrottle.throttle('history', const Duration(seconds: 1), () {
|
||||
_subController.onLoad();
|
||||
});
|
||||
@@ -54,7 +59,7 @@ class _SubPageState extends State<SubPage> {
|
||||
Map? data = snapshot.data;
|
||||
if (data != null && data['status']) {
|
||||
return Obx(() => CustomScrollView(
|
||||
controller: scrollController,
|
||||
controller: _subController.scrollController,
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
slivers: [
|
||||
SliverGrid(
|
||||
|
||||
@@ -54,6 +54,8 @@ class _SubDetailPageState extends State<SubDetailPage> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
titleStreamC.close();
|
||||
_controller.removeListener(() {});
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -67,6 +67,14 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
|
||||
scrollListener();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
fabAnimationCtr.dispose();
|
||||
scrollController.removeListener(() {});
|
||||
scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void scrollListener() {
|
||||
scrollController = _videoReplyController.scrollController;
|
||||
scrollController.addListener(
|
||||
|
||||
@@ -33,9 +33,7 @@ class VideoReplyReplyPanel extends StatefulWidget {
|
||||
|
||||
class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
|
||||
late VideoReplyReplyController _videoReplyReplyController;
|
||||
late AnimationController replyAnimationCtl;
|
||||
Future? _futureBuilderFuture;
|
||||
late ScrollController scrollController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -46,11 +44,12 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
|
||||
tag: widget.rpid.toString());
|
||||
|
||||
// 上拉加载更多
|
||||
scrollController = _videoReplyReplyController.scrollController;
|
||||
scrollController.addListener(
|
||||
_videoReplyReplyController.scrollController.addListener(
|
||||
() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
if (_videoReplyReplyController.scrollController.position.pixels >=
|
||||
_videoReplyReplyController
|
||||
.scrollController.position.maxScrollExtent -
|
||||
300) {
|
||||
EasyThrottle.throttle('replylist', const Duration(milliseconds: 200),
|
||||
() {
|
||||
_videoReplyReplyController.queryReplyList(type: 'onLoad');
|
||||
@@ -66,7 +65,8 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// scrollController.dispose();
|
||||
_videoReplyReplyController.scrollController.removeListener(() {});
|
||||
_videoReplyReplyController.scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -262,6 +262,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
appbarStream.close();
|
||||
floating.dispose();
|
||||
videoDetailController.floating?.dispose();
|
||||
videoIntroController.videoDetail.close();
|
||||
|
||||
@@ -28,6 +28,13 @@ class _WhisperPageState extends State<WhisperPage> {
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_scrollListener);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future _scrollListener() async {
|
||||
if (_scrollController.position.pixels >=
|
||||
_scrollController.position.maxScrollExtent - 200) {
|
||||
@@ -201,7 +208,8 @@ class _WhisperPageState extends State<WhisperPage> {
|
||||
width: 45,
|
||||
height: 45,
|
||||
type: 'avatar',
|
||||
src: sessionList[i].accountInfo?.face ?? "",
|
||||
src: sessionList[i].accountInfo?.face ??
|
||||
"",
|
||||
),
|
||||
),
|
||||
title: Text(
|
||||
|
||||
@@ -22,7 +22,6 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
|
||||
with WidgetsBindingObserver {
|
||||
final WhisperDetailController _whisperDetailController =
|
||||
Get.put(WhisperDetailController());
|
||||
late TextEditingController _replyContentController;
|
||||
final FocusNode replyContentFocusNode = FocusNode();
|
||||
final _debouncer = Debouncer(milliseconds: 200); // 设置延迟时间
|
||||
late double emoteHeight = 0.0;
|
||||
@@ -35,7 +34,6 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
_whisperDetailController.querySessionMsg();
|
||||
_replyContentController = _whisperDetailController.replyContentController;
|
||||
_focusListener();
|
||||
}
|
||||
|
||||
@@ -82,17 +80,20 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
replyContentFocusNode.removeListener(() {});
|
||||
replyContentFocusNode.dispose();
|
||||
_whisperDetailController.replyContentController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void onChooseEmote(Packages package, Emote emote) {
|
||||
int cursorPosition = _replyContentController.selection.baseOffset;
|
||||
int cursorPosition =
|
||||
_whisperDetailController.replyContentController.selection.baseOffset;
|
||||
if (cursorPosition == -1) cursorPosition = 0;
|
||||
final String currentText = _replyContentController.text;
|
||||
final String currentText =
|
||||
_whisperDetailController.replyContentController.text;
|
||||
final String newText = currentText.substring(0, cursorPosition) +
|
||||
emote.text! +
|
||||
currentText.substring(cursorPosition);
|
||||
_replyContentController.value = TextEditingValue(
|
||||
_whisperDetailController.replyContentController.value = TextEditingValue(
|
||||
text: newText,
|
||||
selection:
|
||||
TextSelection.collapsed(offset: cursorPosition + emote.text!.length),
|
||||
@@ -261,7 +262,8 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
|
||||
label: '私信输入框',
|
||||
child: TextField(
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
controller: _replyContentController,
|
||||
controller:
|
||||
_whisperDetailController.replyContentController,
|
||||
autofocus: false,
|
||||
focusNode: replyContentFocusNode,
|
||||
decoration: const InputDecoration(
|
||||
|
||||
Reference in New Issue
Block a user