首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Flutter中调用main/App类中的方法?

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

Stack Overflow用户
提问于 2019-06-12 20:49:54
回答 1查看 5.2K关注 0票数 1

我需要从另一个小部件App类调用。如何获取对app类的引用?我尝试了这样的东西:

静态应用myApp = this;

但是“这”没有定义,也没有“自我”的定义。

有没有办法让" app“成为变量,或者把app对象放到某种全局变量中?

编辑:

更清楚的是:我使用了一个选项卡式导航风格的应用程序,并想要显示一个全屏旋转指示器(ModalProgressHud),表明有一些东西正在从后端加载。现在,当我将微调器代码添加到某些屏幕时,当微调器显示时,选项卡仍然可见并可单击。因此,围绕选项卡栏创建,将微调代码移到主应用程序文件中。

代码语言:javascript
复制
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:_saving,颜色: Colors.grey,不透明度: 0.5),

代码语言:javascript
复制
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()函数。

EN

回答 1

Stack Overflow用户

发布于 2019-06-13 03:45:45

尝试像在Flutter for Web中所做的那样,导入文件并使用as,然后您就有了调用方法的参考

代码语言:javascript
复制
import 'package:hello_web/main.dart' as app;

main() async {
  app.main();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56562659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档