dart 如何从不同的类中删除覆盖

yhuiod9q  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(89)

我在一个类中插入了一个覆盖,并试图使用超时将它从另一个类中删除。
这是持有覆盖图的类

class Notify extends StatelessWidget{
    

  @override
  Widget build(BuildContext context){
    return Text('hey');
  }
  OverlayEntry? _overlayEntry;

  void _insertOverlay(BuildContext context) {
    _overlayEntry = OverlayEntry(builder: (context) {
      return Positioned(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        top: 0,
        left: 0,
        child: Material(
          color: const Color(0xFF0E3311).withOpacity(0.2),
          child: GestureDetector(
            onTap: ()=>_overlayEntry?.remove(),
            child:Icon(Icons.home, size: 100,),
          )
        ),
      );
    });
    Overlay.of(context).insert(_overlayEntry!);
  }
  
  

  void show(BuildContext context){
    _insertOverlay(context); 
  }

  void dismiss(){
    _overlayEntry?.remove();
  }
}

字符串
我插入了覆盖,并通过在另一个类上粘贴图标来设置超时。这是该类。我想在设置同一类中的时间设置后删除它。请参阅下面的类

class Fd extends StatelessWidget{

  late  Timer rtime;
  int _start=4;
  int _dstart=4;

  Timer timeItOut() {

      const oneSec = const Duration(seconds: 1);
      rtime = new Timer.periodic(
        oneSec,
            (Timer timer)
            {
        
        
            if (_start == 1) {
              _start = _dstart;
              rtime.cancel();
              Notify().dismiss();
            } else {
              _start = _start - 1;
              print('still counting down $_start');
            }

            }
      );
      return rtime;
  }
  @override
  Widget build(BuildContext context){

    return Scaffold(
      appBar: AppBar(title: Text('Feeding the nation'),),
      body: Container(
        child:IconButton(icon: Icon(Icons.food_bank),onPressed: (){timeItOut(); Notify().show(context);},)
      ),
    );
  }
}


remove方法在类中工作得很好,我通过在构建的覆盖层上粘贴来插入覆盖层,但当我试图在持有覆盖层的类之外实现它时,它不起作用

bgtovc5b

bgtovc5b1#

好吧,经过几个小时的搜索,我没有找到解决方案,所以我不得不重新构建我的代码,看起来像我需要的东西,它对我来说工作得很好。
我想避免在每个类中有太多的文本,我想实现覆盖,必须在一个单独的类中创建覆盖,并在每个需要的类中实现它。
对于那些可能需要它的人,请看我下面的解决方案
覆盖类在这里...

class Notify extends StatelessWidget{
    

  @override
  Widget build(BuildContext context){
    return Text('hey');
  }

  OverlayEntry _insertOverlay(BuildContext context) {
    return OverlayEntry(builder: (context) {
      return Positioned(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        top: 0,
        left: 0,
        child: Material(
          color: const Color(0xFF0E3311).withOpacity(0.2),
          child: GestureDetector(
            //onTap: ()=>_overlayEntry?.remove(),
            child:Icon(Icons.home, size: 100,),
          )
        ),
      );
    });
    //Overlay.of(context).insert(_overlayEntry!);
  }
  
  

  void show(BuildContext context, OverlayEntry _overlayentry){
    Overlay.of(context).insert(_overlayentry); 
  }

  void dismiss(OverlayEntry _overlayEntry){
    _overlayEntry.remove();
  }
}

字符串
在下面的类中调用并实现...

class Fd extends StatelessWidget{

      late  Timer rtime;
      int _start=4;
      int _dstart=4;

      OverlayEntry? _overlayentry;

      Timer timeItOut() {

          const oneSec = const Duration(seconds: 1);
          rtime = new Timer.periodic(
            oneSec,
                (Timer timer)
                {
            
            
                if (_start == 1) {
                  _start = _dstart;
                  rtime.cancel();
                  Notify().dismiss(_overlayentry!);
                } else {
                  _start = _start - 1;
                  print('still counting down $_start');
                }

                }
          );
          return rtime;
      }
      @override
      Widget build(BuildContext context){
        _overlayentry = Notify()._insertOverlay(context);
        return Scaffold(
          appBar: AppBar(title: Text('Feeding the nation'),),
          body: Container(
            child:IconButton(icon: Icon(Icons.food_bank),onPressed: (){timeItOut(); Notify().show(context,_overlayentry!);},)
          ),
        );
      }
  }

相关问题