Как вызвать функцию из другого класса 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(),
),
]
)