gpt4 book ai didi

flutter - 在 Flutter 的 main/App 类中调用方法?

转载 作者:IT王子 更新时间:2023-10-29 07:18:28 26 4
gpt4 key购买 nike

我需要从另一个小部件调用 App 类。我怎样才能获得对应用程序类的引用?我试过这样的事情:

静态应用 myApp = this;

但是没有定义“this”,也没有定义“self”。

有没有办法制作“App”变量或将 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”)内的构建函数中:

body: ModalProgressHUD(child: buildTabs(context), inAsyncCall: _saving, color: Colors.grey, opacity: 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() 函数。

最佳答案

首先,我想知道为什么你需要传递app类的引用?

如果您想传递应用程序实例或将其引用到子小部件,您可以创建一个小部件类,其构造函数接受 App 对象。

NOTE: If you need this because you have to pass on some data, you might consider using provider or 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),
);
}
}

希望这对您有所帮助。

关于flutter - 在 Flutter 的 main/App 类中调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com