Вы должны быть осторожны с тем, что вы пытаетесь сделать, потому что у вас может быть доступ к странице / виджету, который не смонтирован.Представьте, что вы делаете pushReplacement(new MaterialPageroute(...))
.Предыдущая страница больше не доступна в дереве, поэтому вы не можете получить к ней доступ или к любому из ее методов.
Если у вас нет четких отношений родитель-потомок в вашем дереве, вы должны абстрагировать свою логику от внешнего илизанятия по бизнес логике.Таким образом, вы уверены, что вызываете активные экземпляры ваших классов.
Вот пример того, что вы могли бы использовать, передавая объект Business.Было бы даже лучше, если бы вы использовали другие шаблоны, такие как BLOC, ScopedModel, Streams и т. Д. Но для простоты я думаю, что этого будет достаточно.
import "package:flutter/material.dart";
void main() {
runApp(MyApp(new Logic()));
}
class Logic {
void doSomething() {
print("doing something");
}
}
class MyApp extends StatelessWidget {
final Logic logic;
MyApp(this.logic);
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new HomePage(widget.logic),
);
}
}
class HomePage extends StatelessWidget {
final Logic logic;
HomePage(this.logic);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: () { Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => AnotherPage(logic),
))},
child: Text("Go to AnotherPage"),
),
),
);
}
}
class AnotherPage extends StatelessWidget {
final Logic logic;
AnotherPage(this.logic);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: logic.doSomething,
child: Text("Press me"),
),
),
);
}
}
Если вы все еще хотите вызвать функцию вдругая страница и вы уверены, что страница смонтирована (вы сделали push
вместо pushReplacement
), вы можете сделать следующее.(обращайтесь с осторожностью)
class HomePage extends StatelessWidget {
HomePage();
void onCalledFromOutside() {
print("Call from outside");
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: () { Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => AnotherPage(onCalledFromOutside),
))},
child: Text("Go to AnotherPage"),
),
),
);
}
}
class AnotherPage extends StatelessWidget {
final Function callback
AnotherPage(this.callback);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: callback,
child: Text("Press me"),
),
),
);
}
}