Home > Mobile >  How to use a method in a Stateful Widget from another Widget
How to use a method in a Stateful Widget from another Widget

Time:01-24

So i have this toggle() method in the Stateful SideBar class

class SideBar extends StatefulWidget {
  const SideBar({super.key});
  @override
  State<SideBar> createState() => _SideBarState();
}


class _SideBarState extends State<SideBar> with SingleTickerProviderStateMixin{
  void toggle() {
    if (_controller.isCompleted) {
      _controller.reverse();
    }
    else {_controller.forward();}
  }
}

and i want to use it in

class SideBarWidget extends StatelessWidget {
   SideBarWidget({Key? key}) : super(key: key);

  final SideBar sideBarWidget = SideBar(...);

  void toggle() {
    // here i want to use the toggle() method
  }

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

I cannot use sideBarWidget.toggle() I also cannot pass it as a parameter becasue the _controller is in the SideBar() widget

CodePudding user response:

There are many ways, but the most common end simple is to create an instance of the class SideBar like for example: var side = SideBar(); inside the SideBarWidget class And then you can access the toggle() method like side.toggle().

CodePudding user response:

One way is to give the SideBar a GlobalKey and get the state from the key afterwards. An example:

class SideBar extends StatefulWidget {
  const SideBar({super.key});
  @override
  State<SideBar> createState() => SideBarState();
}

class SideBarState extends State<SideBar> with SingleTickerProviderStateMixin{
  @override
  Widget build(BuildContext context) {
    return Container();
  }

  void toggle() {
    print('toggle');
  }
}

class SideBarWidget extends StatelessWidget {
  SideBarWidget({Key? key}) : super(key: key);

  final GlobalKey<SideBarState> sideBarKey = GlobalKey();

  late final SideBar sideBarWidget = SideBar(key: sideBarKey);

  void toggle() {
    sideBarKey.currentState?.toggle();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextButton(onPressed: toggle, child: const Text('click')),
        sideBarWidget,
      ],
    );
  }
}

CodePudding user response:

remove underscore from SideBarState

to use method of SideBarState in SideBarWidget use: SideBarState().toggle();

**screen1.dart**

    class ParentWidget extends StatefulWidget {
              const ParentWidget({Key? key}) : super(key: key);
            
         
    
     @override
          State<ParentWidget> createState() => ParentWidgetState();
        }
        
    class ParentWidgetState extends State<ParentWidget> {
      
      void printData() {
        print("parent");
      }
    
      @override
      Widget build(BuildContext context) {
        return const Placeholder();
      }
    }

**screen2.dart**

    import 'package:demo/screen_1.dart';
    import 'package:flutter/material.dart';
    
    class ChildWidget extends StatelessWidget {
      const ChildWidget({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        ParentWidgetState().printData();
        return const Placeholder();
      }
    }
  • Related