Как отключить все элементы управления в пользовательском нижнем листе только во время будущей задержки

#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
и передать логическое значение, чтобы включить или отключить поглощение.