#flutter #dart
#flutter #dart
Вопрос:
У меня есть нижний лист, как показано на рисунке ниже:
проблема теперь, когда дважды щелкните какие-либо элементы управления, например, дважды щелкните кнопки переключения или быстро переключайтесь между вкладками в части сортировки, отображается черный экран, как показано ниже:
и я обнаружил эту ошибку:
[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: A DashboardService was used after being disposed.
Once you have called dispose() on a DashboardService, it can no longer be used.
и это приведенный ниже виджет части кода:
import 'package:BOTS/globals/localize.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:BOTS/widgets/forms/heightSpacer.dart';
import 'package:BOTS/widgets/label.dart';
import 'package:BOTS/widgets/revenyouDivider.dart';
import '../../backend/backend.dart';
import '../../globals/constants.dart';
import 'package:BOTS/pages/dashboard/dashboardService.dart';
class DashboardOptionsBottomSheet extends StatefulWidget {
final DashboardService dashboardService;
// final bool open;
const DashboardOptionsBottomSheet({
Key key,
this.dashboardService,
// this.open,
}) : super(key: key);
@override
DashboardOptionsBottomSheetState createState() =>
DashboardOptionsBottomSheetState(dashboardService);
}
class DashboardOptionsBottomSheetState
extends State<DashboardOptionsBottomSheet> {
final DashboardService dashboardService;
// bool open;
DashboardOptionsBottomSheetState(this.dashboardService);
@override
Widget build(BuildContext context) {
final _width = MediaQuery.of(context).size.width;
final _segmentWidth = (_width - 50.0) / 3;
String results = Localize.of(context).trans("dashboardOptions.results");
String newest = Localize.of(context).trans("dashboardOptions.newest");
String amount = Localize.of(context).trans("dashboardOptions.amount");
var sharedValue = 0;
final bold = FontWeight.w700;
final med = FontWeight.w500;
FontWeight _resultsWeight = med;
FontWeight _newestWeight = med;
FontWeight _amountWeight = med;
Map<int, Widget> segmentMap() {
return <int, Widget>{
0: Container(
height: 37,
width: _segmentWidth,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Label(
textAlign: TextAlign.center,
text: results,
size: 14,
fontWeight: _resultsWeight,
),
]),
),
1: Container(
height: 37,
width: _segmentWidth,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Label(
textAlign: TextAlign.center,
text: newest,
size: 14,
fontWeight: _newestWeight,
),
]),
),
2: Container(
height: 37,
width: _segmentWidth,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Label(
textAlign: TextAlign.center,
text: amount,
size: 14,
fontWeight: _amountWeight,
),
]),
),
};
}
SortedBy sortedBy = dashboardService.sortedBy;
switch (sortedBy) {
case SortedBy.results:
sharedValue = 0;
_resultsWeight = bold;
_newestWeight = med;
_amountWeight = med;
break;
case SortedBy.newest:
sharedValue = 1;
_resultsWeight = med;
_newestWeight = bold;
_amountWeight = med;
break;
case SortedBy.amount:
sharedValue = 2;
_resultsWeight = med;
_newestWeight = med;
_amountWeight = bold;
break;
}
String _sorted;
return Material(
child: Container(
height: 380,
decoration: BoxDecoration(
color: Color(contrastColor3),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
HeightSpacer(height: 30),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
padding: const EdgeInsets.only(left: 25),
child: TitleLabel(
text: Localize.of(context).trans("dashboardOptions.sortBy"),
size: 16,
),
),
],
),
HeightSpacer(height: 20),
Padding(
padding: EdgeInsets.only(left: 25.0, right: 25.0),
child: Container(
child: CupertinoSlidingSegmentedControl(
children: segmentMap(),
onValueChanged: (int val) {
sharedValue = val;
SortedBy sortedBy;
switch (val) {
case 0:
sortedBy = SortedBy.results;
_sorted = "results";
_newestWeight = med;
_amountWeight = med;
break;
case 1:
sortedBy = SortedBy.newest;
_sorted = "newest";
_resultsWeight = med;
_amountWeight = med;
break;
case 2:
sortedBy = SortedBy.amount;
_sorted = "amount";
_resultsWeight = med;
_newestWeight = med;
break;
}
dashboardService.clearStrategies();
dashboardService.sortedBy = sortedBy;
prefs.sortedBy = _sorted;
dashboardService
.getBalanceData(dashboardService.showCrypto);
dashboardService.fetchAllStrategies();
setState(() {});
Future.delayed(const Duration(milliseconds: 300), () {
Navigator.of(context).pop();
});
},
groupValue: sharedValue,
),
),
),
HeightSpacer(height: 20),
RevenYouDivider(
color: Colors.black.withOpacity(0.2),
),
HeightSpacer(height: 30),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
padding: const EdgeInsets.only(left: 25),
child: TitleLabel(
text:
Localize.of(context).trans("dashboardOptions.display"),
size: 16,
),
),
],
),
HeightSpacer(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
padding: const EdgeInsets.only(left: 25),
child: Label(
text: Localize.of(context)
.trans("dashboardOptions.showGraphs"),
size: 14,
),
),
Padding(
padding: EdgeInsets.only(right: 15),
child: Switch(
value: dashboardService.showGraphs,
onChanged: (val) {
dashboardService.clearStrategies();
dashboardService.showGraphs = val;
prefs.showGraphs = val;
dashboardService
.getBalanceData(dashboardService.showCrypto);
dashboardService.fetchAllStrategies();
// Update the switch UI, then pop the bottomsheet after a delay
setState(() {});
Future.delayed(const Duration(milliseconds: 300), () {
Navigator.of(context).pop();
});
},
activeColor: Colors.white,
activeTrackColor: Color(primaryColor5),
inactiveTrackColor: Color(contrastColor2),
),
),
],
),
HeightSpacer(height: 12),
RevenYouDivider(
color: Colors.black.withOpacity(0.1),
),
HeightSpacer(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
padding: const EdgeInsets.only(left: 25),
child: Label(
text: Localize.of(context)
.trans("dashboardOptions.showCrypto"),
size: 14,
),
),
Padding(
padding: EdgeInsets.only(right: 15),
child: Switch(
value: dashboardService.showCrypto,
onChanged: (val) {
dashboardService.clearStrategies();
dashboardService.showCrypto = val;
prefs.showCrypto = val;
dashboardService.getBalanceData(val);
dashboardService.fetchAllStrategies();
// Update the switch UI, then pop the bottomsheet after a delay
setState(() {});
Future.delayed(const Duration(milliseconds: 300), () {
Navigator.of(context).pop();
});
},
activeColor: Colors.white,
activeTrackColor: Color(primaryColor5),
activeThumbImage: AssetImage(
"assets/artwork/crypto/crypto.webp",
),
inactiveThumbImage: AssetImage(
"assets/artwork/euro/euro.webp",
),
inactiveTrackColor: Color(contrastColor2),
),
),
],
),
HeightSpacer(height: 12),
RevenYouDivider(
color: Colors.black.withOpacity(0.1),
),
Container(height: 20),
],
),
),
);
}
}
и это панель инструментов части.dart, который возвращает нижний лист:
return DashboardOptionsBottomSheet(
dashboardService: service,
);
что мне нужно сейчас, я хочу отключить любую кнопку или любой элемент управления на нижнем листе после нажатия любого элемента только во время будущей задержки и снова включить их после исчезновения нижнего листа.
Я попытался найти виджет отключить другой виджет AbsorbPointer()
, но я не знаю, как поставить этот виджет в условие для обработки этого…
Есть предложения по решению этой проблемы?
Ответ №1:
оберните виджет виджетом AbsorbPointer
AbsorbPointer(
absorbing: _absorbing,
child: CustomWidget(),
)
Самый простой способ — создать StreamController, обернуть ваш виджет с помощью StreamBuilder
и передать логическое значение, чтобы включить или отключить поглощение.