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

时间:2019-06-12 12:49:54

标签: flutter dart

我需要从另一个小部件调用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()函数。

2 个答案:

答案 0 :(得分:1)

首先,我想知道为什么您需要传递应用程序类的引用?

如果要传递应用程序实例或将其引用到子窗口小部件,则可以使用接受App对象的构造函数创建窗口小部件类。

  

注意:如果因为需要传递一些数据而需要这样做,则可以考虑使用providerinheritedWidget + 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();
}