【问题标题】:How to open a specific screen with quick_actions official plugin in flutter?如何在flutter中使用quick_actions官方插件打开特定屏幕?
【发布时间】:2019-08-22 05:09:04
【问题描述】:

我在我的项目中实现了Quick_actions 插件,我想打开一个特定的屏幕,但在快速操作处理函数中,导航器不起作用。带有Try-Catch,异常显示上下文显示来自导航器,但我使用的是我的 MaterialApp 的 navigatorKey 的上下文。

如果我将任何其他函数(如 print('some text'))放入它可以工作,那么问题只会在我尝试使用导航器时发生

创建快速操作并添加处理函数

createQuickActions() {
    quickActions.initialize(
      (String shortcutId) {
        switch (shortcutId) {
          case 'settings':
            try {
              Navigator.push(
                MyApp.navigatorKey.currentContext,
                MaterialPageRoute(
                  builder: (context) => SettingsScreen(sistemas),
                ),
              );
            } catch (e) {
              print(e);
            }
            print('selected: $shortcutId');
          break;
        }
      }
    );
  }

初始化快速操作

 quickActions.setShortcutItems(
      <ShortcutItem>[
        const ShortcutItem(
          type: 'settings',
          localizedTitle: 'settings',
          icon: 'settings',
        ),
     ],
   );

所有这些代码都在我的SplashScreen 中,因为插件的文档说应该处于应用程序的早期状态

我希望应用程序打开 settings screenprint 'settings',但如果应用程序已经打开,它会打开 main screenprint 'settings',但如果不是,它会尝试打开某些东西然后关闭自己(不是force close留言)

【问题讨论】:

    标签: dart flutter dart-pub


    【解决方案1】:

    在以下示例中, 在快速操作中使用 MainView 将打开 Login 小部件,直接单击应用将打开 Home 小部件

    详情可以参考https://www.filledstacks.com/snippet/managing-quick-actions-in-flutter/

    完整代码

    import 'package:flutter/material.dart';
    import 'package:quick_actions/quick_actions.dart';
    import 'dart:io';
    
    class QuickActionsManager extends StatefulWidget {
      final Widget child;
      QuickActionsManager({Key key, this.child}) : super(key: key);
    
      _QuickActionsManagerState createState() => _QuickActionsManagerState();
    }
    
    class _QuickActionsManagerState extends State<QuickActionsManager> {
      final QuickActions quickActions = QuickActions();
    
      @override
      void initState() {
        super.initState();
        _setupQuickActions();
        _handleQuickActions();
      }
    
      @override
      Widget build(BuildContext context) {
        return widget.child;
      }
    
      void _setupQuickActions() {
        quickActions.setShortcutItems(<ShortcutItem>[
          ShortcutItem(
              type: 'action_main',
              localizedTitle: 'Main view',
              icon: Platform.isAndroid ? 'quick_box' : 'QuickBox'),
          ShortcutItem(
              type: 'action_help',
              localizedTitle: 'Help',
              icon: Platform.isAndroid ? 'quick_heart' : 'QuickHeart')
        ]);
      }
    
      void _handleQuickActions() {
        quickActions.initialize((shortcutType) {
          if (shortcutType == 'action_main') {
            Navigator.push(
                context, MaterialPageRoute(builder: (context) => Login()));
          } else if(shortcutType == 'action_help') {
            print('Show the help dialog!');
          }
        });
      }
    
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'QuickActions Demo', home: QuickActionsManager(child: Home()));
      }
    }
    
    class Home extends StatelessWidget {
      const Home({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(body: Center(child: Text('Home')));
      }
    }
    
    class Login extends StatelessWidget {
      const Login({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(body: Center(child: Text('Login')));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多