Flutter应用启动器入口插件launcher_entry的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter应用启动器入口插件launcher_entry的使用

标题

Flutter应用启动器入口插件launcher_entry的使用

内容

一个围绕Unity LauncherAPI的包装器,允许在常见的Linux桌面环境中显示计数徽章和进度条在启动器图标上。

示例代码

import 'package:flutter/material.dart';
import 'package:launcher_entry/launcher_entry.dart';

void main() {
  runApp(const App());
}

class App extends StatelessWidget {
  const App({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: LauncherEntryTestPage());
  }
}

class LauncherEntryTestPage extends StatefulWidget {
  const LauncherEntryTestPage({super.key});

  [@override](/user/override)
  State<LauncherEntryTestPage> createState() => _LauncherEntryTestPageState();
}

class _LauncherEntryTestPageState extends State<LauncherEntryTestPage> {
  bool countVisible = false;
  bool progressVisible = false;
  int count = 0;
  double progress = 0;
  bool urgent = false;
  final service = LauncherEntryService(appUri: 'application://example.desktop');

  [@override](/user/override)
  Widget build(BuildContext context) {
    service.update(
      count: count,
      countVisible: countVisible,
      progress: progress,
      progressVisible: progressVisible,
      urgent: urgent,
    );
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            Row(
              children: [
                const Text('count visible'),
                const Spacer(),
                Checkbox(
                  value: countVisible,
                  onChanged: (value) =>
                      setState(() => countVisible = value ?? false),
                )
              ],
            ),
            Row(
              children: [
                const Text('progress visible'),
                const Spacer(),
                Checkbox(
                  value: progressVisible,
                  onChanged: (value) =>
                      setState(() => progressVisible = value ?? false),
                )
              ],
            ),
            Row(
              children: [
                const Text('urgent'),
                const Spacer(),
                Checkbox(
                  value: urgent,
                  onChanged: (value) => setState(() => urgent = value ?? false),
                )
              ],
            ),
            Row(
              children: [
                const Text('count'),
                const Spacer(),
                ElevatedButton(
                  onPressed: () => setState(() => count++),
                  child: const Text('+'),
                ),
                const SizedBox(width: 1e6),
                ElevatedButton(
                  onPressed: () => setState(() => count--),
                  child: const Text('-'),
                ),
              ],
            ),
            Row(
              children: [
                const Text('progress'),
                const Spacer(),
                Slider(
                  value: progress,
                  min: 0,
                  max: 1,
                  onChanged: (value) => setState(() => progress = value),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用启动器入口插件launcher_entry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用启动器入口插件launcher_entry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,launcher_entry 插件通常用于定义应用的启动器入口点,这在处理多个活动(Activities)或需要特定启动行为时非常有用。以下是如何在Flutter项目中使用 launcher_entry 插件的一个示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 launcher_entry 依赖:

dependencies:
  flutter:
    sdk: flutter
  launcher_entry: ^最新版本号  # 请替换为实际最新版本号

然后,运行 flutter pub get 以获取依赖。

配置 AndroidManifest.xml

android/app/src/main/AndroidManifest.xml 中,你需要配置一个或多个 <activity> 标签,每个标签代表一个可能的启动器入口。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        android:label="yourapp"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 添加额外的启动器入口 -->
        <activity
            android:name=".SecondActivity"
            android:launchMode="singleTop"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="yourappscheme" android:host="second" />
            </intent-filter>
        </activity>
    </application>
</manifest>

在上面的例子中,我们定义了两个活动:MainActivity 作为默认启动器入口,SecondActivity 作为通过特定 URL Scheme 启动的入口。

Flutter 代码实现

在 Flutter 代码中,你不需要直接与 launcher_entry 插件交互,因为它主要用于配置 Android 层面的行为。但是,你可能需要处理不同的启动场景,例如根据启动参数导航到不同的页面。

你可以在 lib/main.dart 中使用 Window.defaultRouteName 来获取启动参数,并根据这些参数导航:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: '/', // 默认路由
      routes: {
        '/': (context) => HomeScreen(),
        '/second': (context) => SecondScreen(),
      },
      onGenerateRoute: (RouteSettings settings) {
        // 异步获取启动参数
        WidgetsBinding.instance?.addPostFrameCallback((_) async {
          String? routeName = settings.name!;
          try {
            if (Platform.isAndroid) {
              routeName = await Window.defaultRouteName;
            }
          } catch (e) {
            // 处理异常
          }

          // 根据启动参数导航
          if (routeName == '/second') {
            Navigator.of(context).pushNamed('/second');
          }
        });
        return MaterialPageRoute(builder: (context) => HomeScreen());
      },
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: Text('This is the home screen'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 打开第二个屏幕的 URL Scheme
          if (Platform.isAndroid) {
            Uri uri = Uri(scheme: 'yourappscheme', host: 'second');
            launch(uri.toString());
          }
        },
        tooltip: 'Open Second Screen',
        child: Icon(Icons.open_in_new),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: Text('This is the second screen'),
      ),
    );
  }
}

在这个例子中,我们定义了两个屏幕:HomeScreenSecondScreen。应用启动时默认显示 HomeScreen,但如果在 Android 上通过特定的 URL Scheme 启动应用,它将导航到 SecondScreen

请注意,由于 Window.defaultRouteName 是一个异步操作,我们在 onGenerateRoute 中使用 WidgetsBinding.instance.addPostFrameCallback 来确保在应用框架构建完成后获取启动参数。这种方法可能不是性能最优的,但在大多数情况下足够用。

这个示例展示了如何在 Flutter 应用中配置和使用多个启动器入口,并通过代码处理不同的启动场景。

回到顶部