Flutter滑动切换屏幕插件swipe_screen的使用

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

Flutter滑动切换屏幕插件swipe_screen的使用

特性

  • 屏幕切换可以通过四个方向的手势来触发。
    • swipeFromLeft: 从左到右
    • swipeFromTop: 从上到下
    • swipeFromRight: 从右到左
    • swipeFromBottom: 从下到上
  • 可以在任意时刻启动屏幕滑动。
    • 当设置 movement 后,屏幕滑动会在执行 startTransition() 方法时开始。
    • 通过 startTransition() 方法的参数可以设置滑动的方向。
  • 可以选择屏幕切换的类型。
    • 将目标屏幕叠加在当前屏幕上 (TransitionType.push)
    • 将目标屏幕从当前屏幕下方显示出来 (TransitionType.pop)
  • 可以与滚动小部件共存。
    • 滚动小部件的控制器必须分配给 currentScreenBuilder 提供的 ScrollController
  • 可以指定屏幕切换完成后要执行的过程。
    • 使用 onSwiped 可以获取滑动的方向。
    • 对于每个滑动方向可以实现不同的过程。

开始使用

pubspec.yaml 文件中添加 swipe_screen 插件的最新版本作为依赖项:

dependencies:
  swipe_screen: ^[latest version]

使用方法

  • 参数
    • SwipeScreen
    • SwipeTransition
  • 示例
参数
  • SwipeScreenSwipeTransition 都需要启用屏幕滑动。
  • 每个类的参数如下所示。
SwipeScreen
参数 描述
currentScreenBuilder Function 创建当前屏幕的构建器。如果要在屏幕上放置滚动小部件,则该小部件的控制器必须是此函数提供的 ScrollController
movement SwipeMovement 启用在任意时刻启动屏幕滑动
swipeFromLeft SwipeTransition 创建一个从左到右滑动的屏幕
swipeFromTop SwipeTransition 创建一个从上到下滑动的屏幕
swipeFromRight SwipeTransition 创建一个从右到左滑动的屏幕
swipeFromBottom SwipeTransition 创建一个从下到上滑动的屏幕
onSwiped SwipeCallBack 在滑动完成且屏幕切换完成后调用的回调。可以获取滑动的方向
shadowColor Color 设置屏幕边缘的阴影颜色
isScrollEnable bool 如果要在 currentScreenBuilder 上放置滚动小部件,请设置为 true
initialScrollOffset double 如果当前屏幕可滚动,可以设置初始滚动偏移量
SwipeTransition
参数 描述
screen Widget 创建一个通过滑动进行过渡的屏幕的小部件
transitionType TransitionType 通过滑动屏幕的过渡类型
enableSwipe bool 启用或禁用此方向的屏幕滑动

滑动屏幕有两种类型:

  • TransitionType.push
    过渡使目标屏幕覆盖当前屏幕。
  • TransitionType.pop
    要过渡到的屏幕从当前屏幕下方显示出来。
示例
代码
HomeScreen
final SwipeMovement _movement = SwipeMovement();

SwipeScreen(
  key: UniqueKey(),
  movement: _movement,
  swipeFromLeft: SwipeTransition(
    screen: LeftScreen(),
    transitionType: TransitionType.push,
  ),
  currentScreenBuilder: (ScrollController controller) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'HomeScreen',
              style: TextStyle(
                fontSize: 32,
              ),
            ),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _movement.startTransition(SwipeDirection.fromLeft);
                });
              },
              child: const Text(
                'to LeftScreen',
              ),
            ),
          ],
        ),
      ),
    );
  },
  onSwiped: (direction) {
    if (direction == SwipeDirection.fromLeft) {
      Navigator.push(
        context,
        PageRouteBuilder(
          pageBuilder: (_, __, ___) => LeftScreen(),
          transitionDuration: const Duration(seconds: 0),
        ),
      );
    }
  },
);
LeftScreen
final SwipeMovement _movement = SwipeMovement();
WillPopScope(
  child: SwipeScreen(
    key: UniqueKey(),
    movement: _movement,
    swipeFromRight: SwipeTransition(
      screen: HomeScreen(),
      transitionType: TransitionType.pop,
    ),
    currentScreenBuilder: (ScrollController controller) {
      return Scaffold(
        backgroundColor: Colors.red.shade100,
        body: const Center(
          child: Text(
            'LeftScreen',
            style: TextStyle(
              fontSize: 32,
            ),
          ),
        ),
      );
    },
    onSwiped: (direction) {
      if (direction == SwipeDirection.fromRight) {
        Navigator.of(context).pop();
      }
    },
  ),
  onWillPop: () async {
    setState(() {
      _movement.startTransition(SwipeDirection.fromRight);
    });
    return false;
  },
);
动画效果

示例代码

import 'package:example/screen_bottom.dart';
import 'package:example/screen_left.dart';
import 'package:example/screen_right.dart';
import 'package:example/screen_top.dart';
import 'package:flutter/material.dart';
import 'package:swipe_screen/swipe_screen.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'SwipeScreen',
      home: HomeScreen(),
    );
  }
}

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

  [@override](/user/override)
  State<StatefulWidget> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  
  final SwipeMovement _movement = SwipeMovement();
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return SwipeScreen(
      key: UniqueKey(),
      movement: _movement,
      swipeFromLeft: const SwipeTransition(
        screen: LeftScreen(),
        transitionType: TransitionType.push,
      ),
      swipeFromTop: const SwipeTransition(
        screen: TopScreen(),
        transitionType: TransitionType.push,
      ),
      swipeFromRight: const SwipeTransition(
        screen: RightScreen(),
        transitionType: TransitionType.push,
      ),
      swipeFromBottom: const SwipeTransition(
        screen: BottomScreen(),
        transitionType: TransitionType.push,
      ),
      currentScreenBuilder: (ScrollController controller) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text(
                  'HomeScreen',
                  style: TextStyle(
                    fontSize: 32,
                  ),
                ),
                ElevatedButton(
                  onPressed: () {
                    setState(() {
                      _movement.startTransition(SwipeDirection.fromLeft);
                    });
                  }, 
                  child: const Text(
                    'to LeftScreen',
                  ),
                ),
                ElevatedButton(
                  onPressed: () {
                    setState(() {
                      _movement.startTransition(SwipeDirection.fromBottom);
                    });
                  },
                  child: const Text(
                    'to BottomScreen',
                  ),
                ),
              ],
            ),
          ),
        );
      },
      onSwiped: (direction) {
        switch (direction) {
          case SwipeDirection.fromLeft:
            Navigator.push(
              context,
              PageRouteBuilder(
                pageBuilder: (_, __, ___) => LeftScreen(),
                transitionDuration: const Duration(seconds: 0),
              ),
            );
            break;
          case SwipeDirection.fromTop:
            Navigator.push(
              context,
              PageRouteBuilder(
                pageBuilder: (_, __, ___) => TopScreen(),
                transitionDuration: const Duration(seconds: 0),
              ),
            );
            break;
          case SwipeDirection.fromRight:
            Navigator.push(
              context,
              PageRouteBuilder(
                pageBuilder: (_, __, ___) => RightScreen(),
                transitionDuration: const Duration(seconds: 0),
              ),
            );
            break;
          case SwipeDirection.fromBottom:
            Navigator.push(
              context,
              PageRouteBuilder(
                pageBuilder: (_, __, ___) => BottomScreen(),
                transitionDuration: const Duration(seconds: 0),
              ),
            );
            break;
          case SwipeDirection.none:
            break;
        }
      },
    );
  }
}

更多关于Flutter滑动切换屏幕插件swipe_screen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter滑动切换屏幕插件swipe_screen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用swipe_screen插件来实现滑动切换屏幕功能的代码案例。请注意,swipe_screen这个插件可能并不是官方或者广泛使用的插件,因此具体的实现和插件名称可能会有所不同。不过,我会基于类似功能来展示一个可能的实现方法。

首先,确保你的pubspec.yaml文件中已经添加了所需的依赖项。如果swipe_screen是存在的插件,你可以这样添加:

dependencies:
  flutter:
    sdk: flutter
  swipe_screen: ^最新版本号  # 假设这是插件名称和版本号

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

然而,由于swipe_screen可能不是一个真实存在的插件,我将使用flutter_swiper这个流行的滑动插件来展示类似的功能。你可以根据需要调整代码以适应swipe_screen(如果存在的话)。

下面是一个使用flutter_swiper实现滑动切换屏幕的代码示例:

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

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

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

class MyHomePage extends StatelessWidget {
  final List<Widget> screens = [
    ScreenOne(),
    ScreenTwo(),
    ScreenThree(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Swipe Screen Example'),
      ),
      body: Swiper(
        itemCount: screens.length,
        itemBuilder: (BuildContext context, int index) {
          return screens[index];
        },
        pagination: SwiperPagination(),
        control: SwiperControl(),
        autoplay: false,
        scrollDirection: Axis.horizontal,
      ),
    );
  }
}

class ScreenOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Screen One'),
    );
  }
}

class ScreenTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Screen Two'),
    );
  }
}

class ScreenThree extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Screen Three'),
    );
  }
}

在这个示例中,我们使用了flutter_swiper插件来创建一个可以水平滑动的屏幕切换视图。每个屏幕都是一个简单的StatelessWidget,显示不同的文本。

如果你确实想使用swipe_screen插件,并且它提供了类似的API,你可以将上述代码中的Swiper组件替换为swipe_screen插件提供的组件,并调整相应的属性。如果swipe_screen插件的API有所不同,请参考其官方文档进行适配。

请注意,由于swipe_screen可能不是一个真实存在的插件,上述代码使用了flutter_swiper作为替代方案来展示滑动切换屏幕的功能。如果swipe_screen确实存在,你应该参考其官方文档来获取正确的使用方法。

回到顶部