我需要从另一个小部件调用App类。如何获得对应用程序类的引用?我尝试过这样的事情:
static App myApp = this;
但是没有定义“ this”,也没有定义“ self”。
有没有办法制作“ App”变量或将应用程序对象放入某种全局变量?
编辑:
更清楚地说:我使用一个选项卡式导航样式应用程序,并且想要显示一个全屏旋转指示器(ModalProgressHud),表明后端正在加载某些内容。 现在,当我将微调器代码添加到某些屏幕时,显示微调器时,这些选项卡仍将可见且可单击。因此,围绕着标签栏的创建,将微调器代码移至主应用程序文件的想法。
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'My cool app',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: new App(),
);
}
}
现在在App类中,我将像这样启动选项卡,并将它们包装在旋转指示器调用(“ ModalProgressHud”)内的构建函数中:
正文:ModalProgressHUD(子级:buildTabs(上下文),inAsyncCall:_保存,颜色:Colors.grey,不透明度:0.5),
import 'package:modal_progress_hud/modal_progress_hud.dart';
class App extends StatefulWidget {
@override
State<StatefulWidget> createState() => AppState();
}
class AppState extends State<App> {
bool _saving = false;
TabItem currentTab = TabItem.Dashboard;
Map<TabItem, GlobalKey<NavigatorState>> navigatorKeys = {
TabItem.Dashboard: GlobalKey<NavigatorState>(),
TabItem.Family: GlobalKey<NavigatorState>(),
TabItem.Groups: GlobalKey<NavigatorState>(),
TabItem.ShoppingList: GlobalKey<NavigatorState>(),
TabItem.Me: GlobalKey<NavigatorState>(),
};
AppState() {
_initManagers();
}
void _initManagers() {
new BackendManager();
new ShoppingListManager();
new UserManager();
}
void _selectTab(TabItem tabItem) {
UserManager user = new UserManager();
if (user.userIsLoggedIn()) {
// only if user is logged-in we allow to switch bottom navi tabs
setState(() {
currentTab = tabItem;
});
}
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async =>
!await navigatorKeys[currentTab].currentState.maybePop(),
child: Scaffold(
resizeToAvoidBottomPadding: false,
resizeToAvoidBottomInset: false,
// HERE THE WRAP OF THE MAIN TABS IN THE HUD WIDGET
body: ModalProgressHUD(child: buildTabs(context), inAsyncCall: _saving, color: Colors.grey, opacity: 0.5),
bottomNavigationBar: BottomNavigation(
currentTab: currentTab,
onSelectTab: _selectTab,
),
),
);
}
Widget buildTabs(BuildContext context) {
return Stack(children: <Widget>[
_buildOffstageNavigator(TabItem.Dashboard),
_buildOffstageNavigator(TabItem.Search),
_buildOffstageNavigator(TabItem.Shop),
_buildOffstageNavigator(TabItem.ShoppingList),
_buildOffstageNavigator(TabItem.Me),
]);
}
Widget _buildOffstageNavigator(TabItem tabItem) {
return Offstage(
offstage: currentTab != tabItem,
child: TabNavigator(
navigatorKey: navigatorKeys[tabItem],
tabItem: tabItem,
),
);
}
void _submit() {
setState(() {
_saving = true;
});
//Simulate a service call
print('>>>>>> submitting to backend...');
new Future.delayed(new Duration(seconds: 4), () {
setState(() {
_saving = false;
});
});
}
}
ModalProgressHud现在位于应用程序类中。现在的问题是,我想从其他任何小部件中设置/调用ModalProgressHud以显示全屏覆盖旋转指示器。
因此,我一直在考虑全局静态变量是否起作用(以及如何设置它?),或者是否有其他方法可以在App类中调用Submit()函数。
答案 0 :(得分:1)
首先,我想知道为什么您需要传递应用程序类的引用?
如果要传递应用程序实例或将其引用到子窗口小部件,则可以使用接受App
对象的构造函数创建窗口小部件类。
注意:如果因为需要传递一些数据而需要这样做,则可以考虑使用provider或inheritedWidget + BloC。
这只是一个粗略的示例,如果您可以提供更多可能确实有帮助的详细信息,请这样做。
AnotherWidget.dart
class AnotherWidget extends StatelessWidget {
final MyApp myApp;
const AnotherWidget({Key key, this.myApp}) : super(key: key);
// Do whatever you want with myApp instance
}
MyApp.dart
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'AnotherWidgetDemo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AnotherWidget(myApp: this),
);
}
}
希望这会有所帮助。
答案 1 :(得分:0)
尝试像在Flutter for Web中一样进行操作,导入文件并使用as
,然后就可以得到调用方法的参考
import 'package:hello_web/main.dart' as app;
main() async {
app.main();
}