Как вызвать функцию из другого класса statefull во флаттере?

Я изучаю трепетание, я хочу вызвать функцию (которая находится в классе с сохранением состояния) в другом классе с полным состоянием. Искал везде, но твердого решения нет. Может ли кто-нибудь просто предложить или предоставить мне правильный способ вызова функции?

2 ответа

Решение

Попробуйте ниже Код, надеюсь, он вам поможет:

Объявите первый класс с сохранением состояния с помощью вашей функции:

      class MobileGraph extends StatefulWidget {
  _MobileGraphState mobileGraph = _MobileGraphState();
  @override
  _MobileGraphState createState() => mobileGraph;
  mobileGraphFunction() {
    mobileGraph.mobileGraphFunction();
  }
}

class _MobileGraphState extends State<MobileGraph> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: mobileGraphFunction(),
    );
  }
}

затем вызовите mobileGraphFunction в другом классе с отслеживанием состояния, например:

      class Graph extends StatefulWidget {
  @override
  _GraphState createState() => _GraphState();
}

class _GraphState extends State<Graph> {
  MobileGraph mobileGraph;
  @override
  void initState() {
    super.initState();
    mobileGraph = MobileGraph();
  }
@override
  Widget build(BuildContext context) {
    
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'All Graphs',
          style: TextStyle(fontSize: 25),
        ),
        
      ),
      body: mobileGraph(),
    );
  }
}

Вам нужен доступ к экземпляру State, чтобы вызвать одну из его функций. Не зная вашего варианта использования, вы можете создать класс контроллера.

      class CounterController {
  late Function increment();
  late Function decrement();
}

Затем передайте его как параметр вашему виджету.

      class CounterWidget extends StatefulWidget {
  final CounterController? controller;
  CounterWidget({this.controller});
}

Затем назначьте функции в initState.

      class CounterWidgetState extends State<CounterWidget> {
  int count = 0;

  @override
  void initState() {
    widget.controller?.increment = increment;
    widget.controller?.decrement = decrement;
  }

  void increment() {
    setState(() => count++);
  }

  void decrement() {
    setState(() => count--);
  }
}

Затем, наконец, вы можете вызывать функции.

      Row(
  children: [
    CounterWidget(controller: counterController),
    TextButton(
      child: const Text('+'),
      onPressed: () => counterController.increment(),
    ),
    TextButton(
      child: const Text('-'),
      onPressed: () => counterController.decrement(),
    ),
  ]
)
Другие вопросы по тегам