Flutter窗口管理插件android_window的使用

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

Flutter窗口管理插件android_window的使用

android_window 是一个Flutter插件,允许你在Android平台上创建浮动窗口。这对于需要在屏幕任意位置显示小部件的应用非常有用。

安装

要安装 android_window 插件,只需在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  android_window: ^最新版本号

然后运行以下命令来安装插件:

flutter pub add android_window

示例

main.dart

import 'package:android_window/main.dart' as android_window;
import 'package:flutter/material.dart';

import 'android_window.dart';

@pragma('vm:entry-point')
void androidWindow() {
  runApp(const AndroidWindowApp());
}

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

class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: const HomePage(),
      theme: ThemeData(useMaterial3: true),
      darkTheme: ThemeData.dark(useMaterial3: true),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    android_window.setHandler((name, data) async {
      switch (name) {
        case 'hello':
          showSnackBar(context, 'message from android window: $data');
          return 'hello android window';
      }
      return null;
    });
    return Scaffold(
      body: SafeArea(
        child: ListView(padding: const EdgeInsets.all(16), children: [
          ElevatedButton(
            onPressed: () async {
              showSnackBar(
                  context, '${await android_window.canDrawOverlays()}');
            },
            child: const Text('Check can draw overlays'),
          ),
          const ElevatedButton(
            onPressed: android_window.requestPermission,
            child: Text('Request overlay display permission'),
          ),
          ElevatedButton(
            onPressed: () => android_window.open(
              size: const Size(400, 400),
              position: const Offset(200, 200),
            ),
            child: const Text('Open android window'),
          ),
          const ElevatedButton(
            onPressed: android_window.close,
            child: Text('Close android window'),
          ),
          ElevatedButton(
            onPressed: () => android_window.resize(600, 400),
            child: const Text('resize(600, 400)'),
          ),
          ElevatedButton(
            onPressed: () => android_window.resize(400, 600),
            child: const Text('resize(400, 600)'),
          ),
          ElevatedButton(
            onPressed: () => android_window.setPosition(0, 0),
            child: const Text('setPosition(0, 0)'),
          ),
          ElevatedButton(
            onPressed: () => android_window.setPosition(300, 300),
            child: const Text('setPosition(300, 300)'),
          ),
          ElevatedButton(
            onPressed: () async {
              final response = await android_window.post(
                'hello',
                'hello android window',
              );
              showSnackBar(context, 'response from android window: $response');
            },
            child: const Text('Send message to android window'),
          ),
        ]),
      ),
    );
  }

  void showSnackBar(BuildContext context, String title) {
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(title)));
  }
}

android_window.dart

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

class AndroidWindowApp extends StatelessWidget {
  const AndroidWindowApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return AndroidWindow(
      child: Scaffold(
        backgroundColor: Colors.lightGreen.withOpacity(0.9),
        body: const Padding(
          padding: EdgeInsets.all(8),
          child: Text('Hello android window'),
        ),
      ),
    );
  }
}

更多示例

构建

如果你需要构建插件,可以按照以下步骤操作:

mkdir -p android/src/main/java/qiuxiang/android_window
flutter pub run pigeon --input lib/pigeon.dart

通过以上步骤,你可以成功地在Flutter应用中使用 android_window 插件来管理Android浮动窗口。希望这些示例对你有所帮助!


更多关于Flutter窗口管理插件android_window的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter窗口管理插件android_window的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用android_window插件来管理Android窗口的示例代码。android_window插件允许你更精细地控制Flutter应用中的Android窗口属性,例如窗口大小、透明度、布局参数等。

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

dependencies:
  flutter:
    sdk: flutter
  android_window: ^0.x.x  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们编写一个示例应用,展示如何使用android_window插件。

示例代码

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late AndroidWindow _androidWindow;

  @override
  void initState() {
    super.initState();
    _androidWindow = AndroidWindow();

    // 示例:设置窗口透明度
    _androidWindow.setWindowFlags(AndroidWindowFlags.TRANSLUCENT_STATUS);

    // 示例:监听窗口焦点变化
    _androidWindow.windowFocusChange.listen((hasFocus) {
      print("Window has focus: $hasFocus");
      if (hasFocus) {
        // 当窗口获得焦点时执行的操作
      } else {
        // 当窗口失去焦点时执行的操作
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Android Window Management'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 示例:设置窗口布局参数(如全屏)
                  await _androidWindow.setLayout(
                    width: AndroidWindowLayout.MATCH_PARENT,
                    height: AndroidWindowLayout.MATCH_PARENT,
                    gravity: AndroidWindowGravity.CENTER,
                  );
                },
                child: Text('Set Fullscreen'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 示例:恢复默认窗口布局参数
                  await _androidWindow.restoreLayout();
                },
                child: Text('Restore Layout'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 取消监听
    _androidWindow.windowFocusChange.cancel();
    super.dispose();
  }
}

解释

  1. 依赖添加:确保在pubspec.yaml中添加了android_window依赖。
  2. 初始化:在initState方法中初始化AndroidWindow实例,并设置窗口标志(例如透明度)。
  3. 监听窗口焦点变化:使用windowFocusChange流来监听窗口焦点变化。
  4. 按钮操作:提供两个按钮,一个用于设置窗口为全屏模式,另一个用于恢复默认布局参数。
  5. 资源释放:在dispose方法中取消对窗口焦点变化的监听,以避免内存泄漏。

请注意,android_window插件的一些方法和功能可能因版本而异,因此请参考官方文档以获取最新和最准确的信息。此外,由于android_window是一个较底层的插件,它的一些功能可能需要在特定的Android版本或设备上才能正常工作。

回到顶部