Flutter应用启动器入口插件launcher_entry的使用
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
更多关于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'),
),
);
}
}
在这个例子中,我们定义了两个屏幕:HomeScreen
和 SecondScreen
。应用启动时默认显示 HomeScreen
,但如果在 Android 上通过特定的 URL Scheme 启动应用,它将导航到 SecondScreen
。
请注意,由于 Window.defaultRouteName
是一个异步操作,我们在 onGenerateRoute
中使用 WidgetsBinding.instance.addPostFrameCallback
来确保在应用框架构建完成后获取启动参数。这种方法可能不是性能最优的,但在大多数情况下足够用。
这个示例展示了如何在 Flutter 应用中配置和使用多个启动器入口,并通过代码处理不同的启动场景。