Flutter插件Get(5):小组件.md

一 概述

在 GetX 中,无需 context 上下文,便可使用 SmallWidget 小组件:

  • SnackBars 提示信息
  • Dialog 对话框
  • BottomSheets 底部弹窗

先看下效果图:

Flutter_get_D.gif


二、SnackBars(提示信息)

GetX 创建一个 SnackBars 代码如下:

Get.snackbar('SnackBar', '我是SnackBar');

OK,就这么一行代码,我们就轻松的实现了 SnackBar。再看看对应的原生写法:

final snackBar = SnackBar(
  content: Text('SnackBar'),
  action: SnackBarAction(
    label: '我是SnackBar',
    onPressed: (){}
  ),
);

//用Flutter创建一个简单的SnackBar,你必须获得Scaffold的context,或者你必须使用一个GlobalKey附加到你的Scaffold上。
Scaffold.of(context).showSnackBar(snackBar);

这么一对比,看看 Getx 提高了多少效率。看下示例:

// SnackBars
ElevatedButton(
	onPressed: () async {
	Get.snackbar('SnackBar', '我是SnackBar'); // toNamed方法带参数实现页面跳转
	},
	child: const Text("免SnackBars导航")),

三、Dialog(对话框)

同样我们使用 defaultDialog 和 dialog 也不需要 context。仅仅需要一行代码即可。

打开自定义 Dialogs:

Get.dialog(YourDialogWidget());

打开默认 Dialogs 代码如下:

Get.defaultDialog(
	onConfirm: () => debugPrint("Ok"),
	middleText: "我是Dialog",
);

四、BottomSheets(底部弹窗)

Get.bottomSheet 类似于 showModalBottomSheet,但不需要 context:

Get.bottomSheet(Container(
  child: Wrap(
    children: [
      ListTile(
        leading: const Icon(Icons.wb_sunny_outlined),
        title: const Text("白天模式"),
        onTap: () {
          // 改变主题模式(白天模式还是夜晚模式)
          // Get.isDarkMode用来判断是否是夜晚模式
          Get.changeTheme(ThemeData.light());
        },
      ),
      ListTile(
        leading: const Icon(Icons.wb_sunny),
        title: const Text("黑夜模式"),
        onTap: () {
          // 改变主题模式(白天模式还是夜晚模式)
          Get.changeTheme(ThemeData.dark());
        },
      )
    ],
  ),
));

五、全部代码

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
          primarySwatch: Colors.blue,
          appBarTheme: const AppBarTheme(
            centerTitle: true,
          )),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          // SnackBars
          ElevatedButton(
              onPressed: () async {
                Get.snackbar('SnackBar', '我是SnackBar'); // toNamed方法带参数实现页面跳转
              },
              child: const Text("免SnackBars导航")),
          const SizedBox(height: 16),
          // Dialogs
          ElevatedButton(
              onPressed: () async {
                Get.snackbar('Dialogs', '我是Dialogs'); // toNamed方法带参数实现页面跳转
              },
              child: const Text("免Dialogs导航")),
          const SizedBox(height: 16),
          // Dialogs
          ElevatedButton(
              onPressed: () {
                Get.bottomSheet(Container(
                  child: Wrap(
                    children: [
                      ListTile(
                        leading: const Icon(Icons.wb_sunny_outlined),
                        title: const Text("白天模式"),
                        onTap: () {
                          // 改变主题模式(白天模式还是夜晚模式)
                          // Get.isDarkMode用来判断是否是夜晚模式
                          Get.changeTheme(ThemeData.light());
                        },
                      ),
                      ListTile(
                        leading: const Icon(Icons.wb_sunny),
                        title: const Text("黑夜模式"),
                        onTap: () {
                          // 改变主题模式(白天模式还是夜晚模式)
                          Get.changeTheme(ThemeData.dark());
                        },
                      )
                    ],
                  ),
                ));
              },
              child: const Text("免BottomSheets导航")),
        ],
      ),
    );
  }
}

posted @ 2024-10-18 10:11  fengMisaka  阅读(1)  评论(0编辑  收藏  举报