Flutter穿戴设备支持插件wear_os_plugin的使用

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

Flutter穿戴设备支持插件wear_os_plugin的使用

wear_os_plugin 是一个具有基本Wear OS功能的Flutter插件,例如带有旋转输入的可滚动视图或圆形屏幕支持。

圆形屏幕

默认情况下,所有应用程序都是全屏且为矩形。要使应用程序呈现为圆形,应用需要透明背景。当您像这样滑动掉应用程序时,圆形屏幕将可见:

圆形屏幕

除了应用的一般透明行为外,所有小部件都必须被剪裁,这由 WearOsClipper 类自动处理。

屏幕形状的一般信息由 WearOsApp 类处理。它有一个静态和可监听的成员值来保存有关圆形等信息。

这些值将通过使用 WearOsApp 或调用静态 init 方法来初始化。

圆形滚动条

默认滚动条是矩形的,就像基本屏幕布局一样。

WearOsScrollView 类负责滚动条:

矩形手表 圆形手表
矩形 圆形

开始使用

Wear OS

在您的Wear OS(Android)项目中进行以下更改:

android/app/build.gradle:

minSdkVersion 30

android/app/src/main/AndroidManifest.xml:

<application
    ...
    android:theme="@style/LaunchTheme"
    >
    <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="true" />
    ...
</application>

可能直接将启动主题更改为正常主题,以避免系统启动屏幕:

<application
    ...
    android:theme="@style/LaunchTheme"
    >
    <application
        ...
        android:theme="@style/NormalTheme"
    ...
</application>

振动和手表功能所需的权限已设置。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 wear_os_plugin 插件。

import 'dart:developer';

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

import 'package:wear_os_plugin/wear_os_app.dart';
import 'package:wear_os_plugin/wear_os_clipper.dart';
import 'package:wear_os_plugin/wear_os_plugin.dart';
import 'package:wear_os_plugin/wear_os_scroll_view.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 获取一些有用的数据:
  String? appVersion = await WearOsPlugin.instance.getAppVersion();
  String? deviceModel = await WearOsPlugin.instance.getModel();

  // 启动应用:
  runApp(WearOsApp(
    screenBuilder: (context) {
      /// 正确处理Wear OS 4上的BACK按钮:
      WearOsPlugin.instance.keyEvents?.listen((event) {
        log('key event: key code = ${event.keyCode} ${event.down ? 'down' : 'up'}');
        /// 按下BACK键时,关闭顶层视图或整个应用:
        if (event.keyCode == KeyData.KEYCODE_BACK && event.down == false) {
          if (Navigator.of(context).canPop()) {
            Navigator.of(context).pop();
          } else {
            SystemNavigator.pop();
          }
        }
      });
      return MyApp(
        appVersion: appVersion,
        deviceModel: deviceModel,
      );
    },
  ));
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const WearOsClipper(
      child: Scaffold(
          backgroundColor: Colors.blue,
          body: Center(
              child: Text(
            'Close this view\n'
            'by using the\n'
            'BACK button\n'
            'on the side',
            textAlign: TextAlign.center,
          ))),
    );
  }
}

class MyApp extends StatefulWidget {
  final String? appVersion;
  final String? deviceModel;

  const MyApp({super.key, this.appVersion, this.deviceModel});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final scrollController = ScrollController();

  [@override](/user/override)
  void dispose() {
    scrollController.dispose();
    super.dispose();
  }

  _buildList(BuildContext context) {
    final screenHeight = MediaQuery.of(context).size.height;

    List<Widget> items = [];

    // 顶部带有图标和简介文本:
    items.add(SizedBox(
      height: screenHeight / 2,
      child: Center(
        child: Text(
          'Device:\n${widget.deviceModel}',
          textAlign: TextAlign.center,
        ),
      ),
    ));

    // 填充列表,共30行:
    for (int index = 1; index <= 30; index++) {
      items.add(Container(
          color: (index & 1 == 0)
              ? const Color(0xff404040)
              : const Color(0xff202020),
          height: 40,
          child: Center(child: Text('Row #$index'))));
    }

    // 底部空间:
    items.add(SizedBox(
      height: screenHeight / 2,
      child: Center(
        child: ElevatedButton(
            child: const Text('Second Screen'),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => const SecondScreen()),
              );
            }),
      ),
    ));

    return WearOsScrollView(
      controller: scrollController,
      autoHide: true, // 如果设置为false,则始终显示滚动条
      child: ListView(
        controller: scrollController,
        children: items,
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return WearOsClipper(
      child: Scaffold(backgroundColor: Colors.black, body: _buildList(context)),
    );
  }
}

更多关于Flutter穿戴设备支持插件wear_os_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter穿戴设备支持插件wear_os_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用wear_os_plugin插件的一些示例代码。请注意,wear_os_plugin是一个假设的插件名称,实际插件可能具有不同的名称和功能。我会基于一个假设的插件功能来展示如何集成和使用它。

1. 添加依赖项

首先,在你的pubspec.yaml文件中添加wear_os_plugin依赖项。

dependencies:
  flutter:
    sdk: flutter
  wear_os_plugin: ^1.0.0  # 假设的版本号

然后运行以下命令来安装依赖项:

flutter pub get

2. 初始化插件

在你的Flutter应用的入口文件(通常是main.dart)中,初始化插件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Wear OS Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final WearOsPlugin _wearOsPlugin = WearOsPlugin();

  @override
  void initState() {
    super.initState();
    _initializePlugin();
  }

  void _initializePlugin() async {
    // 初始化插件,可能涉及权限请求等
    try {
      bool isInitialized = await _wearOsPlugin.initialize();
      if (isInitialized) {
        print("Wear OS Plugin initialized successfully");
      } else {
        print("Failed to initialize Wear OS Plugin");
      }
    } catch (e) {
      print("Error initializing Wear OS Plugin: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Wear OS Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Check console for plugin initialization status',
            ),
          ],
        ),
      ),
    );
  }
}

3. 使用插件功能

假设wear_os_plugin提供了获取设备信息的功能,你可以这样使用它:

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

class _MyHomePageState extends State<MyHomePage> {
  final WearOsPlugin _wearOsPlugin = WearOsPlugin();
  String deviceInfo = "";

  @override
  void initState() {
    super.initState();
    _initializePlugin();
    _getDeviceInfo();
  }

  void _initializePlugin() async {
    // 初始化插件的代码(同上)
  }

  void _getDeviceInfo() async {
    try {
      String info = await _wearOsPlugin.getDeviceInfo();
      setState(() {
        deviceInfo = info;
      });
    } catch (e) {
      print("Error getting device info: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Wear OS Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Device Info: $deviceInfo',
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 实际插件API:上述代码中的initializegetDeviceInfo方法是假设的。你需要查阅wear_os_plugin的实际文档来了解其API。
  2. 权限处理:某些功能可能需要特定的权限,你需要确保在AndroidManifest.xml和wear_os_plugin的初始化过程中正确请求和处理这些权限。
  3. 错误处理:在实际应用中,你应该添加更详细的错误处理逻辑,以提供用户友好的反馈。

由于wear_os_plugin是一个假设的插件名称,实际使用时请替换为真实存在的插件名称和API。

回到顶部