Flutter方向限制插件limiting_direction_csx的使用

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

Flutter方向限制插件limiting_direction_csx的使用

iOS项目横屏使用配置

一. 调整主项目的info.plist文件添加

<key>UIRequiresFullScreen</key>
<true/>

(即Xcode打开iOS项目,勾选中Targets->General->Deployment Info->Requires full screen(前面选中打勾☑️)) (这个配置主要针对pad的适配,需要添加,单纯的手机应用开发,这个配置可以不用勾选就可以实现其效果)

二 两种方式使用方式不一样,请对号入座!

1. 纯flutter项目: 主项目的Main.storyboard的控制器类型class从FlutterViewController调整为MainViewController

ios配置Main.storyboard

2. module形式接入主项目: 原生在跳转flutter页面的地方将承载flutter的FlutterViewController替换成MainViewController,并注册当前flutter的桥接到原生项目中

module形式接入主项目

详细介绍module的使用为什么这样,看一查看我的博客:原生混合开发flutter Unhandled Exception…

使用代码介绍

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isIOS) {
    // 设置启动即强制横屏
    await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape);
  } else {
    await SystemChrome.setPreferredOrientations(
      [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
  }
  runApp(MyApp());
}
// 或者在需要的地方调用
if (Platform.isIOS) {
  await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape);
}
// 来设置枚举类型,选择自己想要的可支持方位

设备陀螺仪读取(这个无需配置)

// 直接读取当前陀螺仪方位(直接读取不建议使用在项目刚启动的地方):
LimitingDirectionCsx().currentDeviceOrientation

// 流的方式监听陀螺仪:LimitingDirectionCsx().getDeviceDirectionStream()
StreamBuilder<UIDeviceOrientation>(
  stream: LimitingDirectionCsx().getDeviceDirectionStream(),
  builder: (context, AsyncSnapshot snapshot) {
    return Text('结果:${snapshot.data}');
  },
)

// future的方式主动一次性获取陀螺仪转向
LimitingDirectionCsx().getNowDeviceDirection();

完整示例Demo

以下是完整的示例代码:

/*
 * [@Author](/user/Author): Cao Shixin
 * [@Date](/user/Date): 2020-12-28 15:12:15
 * [@LastEditors](/user/LastEditors): Cao Shixin
 * [@LastEditTime](/user/LastEditTime): 2021-01-14 13:44:10
 * [@Description](/user/Description): 
 */
import 'dart:io';

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isIOS) {
    await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape);
  } else {
    await SystemChrome.setPreferredOrientations(
        [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
  }
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    print('>>${LimitingDirectionCsx().currentDeviceOrientation}');
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Plugin example app'),
        ),
        body: StreamBuilder<UIDeviceOrientation>(
          stream: LimitingDirectionCsx().getDeviceDirectionStream(),
          builder: (context, AsyncSnapshot snapshot) {
            return Text('结果:${snapshot.data}');
          },
        ),
      ),
    );
  }
}

更多关于Flutter方向限制插件limiting_direction_csx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter方向限制插件limiting_direction_csx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter中使用limiting_direction_csx插件的代码示例。这个插件通常用于限制用户在特定方向上滚动或拖动。

首先,你需要在你的pubspec.yaml文件中添加这个插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  limiting_direction_csx: ^最新版本号  # 请替换为插件的最新版本号

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

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示了如何限制用户在水平方向上滚动:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Limiting Direction Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Limiting Direction Demo'),
        ),
        body: Center(
          child: LimitedDirectionListView(
            direction: Axis.horizontal, // 限制滚动方向为水平
            child: ListView.builder(
              scrollDirection: Axis.horizontal,
              itemCount: 20,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Container(
                    color: Colors.primaries[index % Colors.primaries.length],
                    width: 100,
                    height: 100,
                    child: Center(
                      child: Text('Item $index'),
                    ),
                  ),
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

class LimitedDirectionListView extends StatelessWidget {
  final Axis direction;
  final Widget child;

  const LimitedDirectionListView({Key? key, required this.direction, required this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (details) {
        // 根据方向限制拖动
        if (direction == Axis.horizontal) {
          // 阻止垂直方向上的拖动
          if (details.delta.dy.abs() > details.delta.dx.abs()) {
            return; // 忽略垂直拖动
          }
        } else if (direction == Axis.vertical) {
          // 阻止水平方向上的拖动
          if (details.delta.dx.abs() > details.delta.dy.abs()) {
            return; // 忽略水平拖动
          }
        }
      },
      child: child,
    );
  }
}

注意

  1. 上面的LimitedDirectionListView是一个自定义的Widget,用于演示如何根据指定的方向限制拖动。然而,limiting_direction_csx插件可能有更高级和简便的方法来实现这一功能。由于我无法直接访问插件的具体实现,这里的代码仅作为一个概念验证。

  2. 在实际使用中,你应该查阅limiting_direction_csx插件的官方文档,以获取更详细和精确的使用方法。

  3. 如果limiting_direction_csx插件提供了内置的Widget或更简便的方法,请按照其文档进行使用。

  4. 上面的代码示例中,LimitedDirectionListView并没有直接使用limiting_direction_csx插件,而是手动实现了方向限制的逻辑。这主要是为了展示如何限制方向的基本概念。在实际应用中,你应该使用插件提供的功能。

回到顶部