【flutter项目实战】第五节 如何在flutter项目中使用getx创建底部tab

假设你已经创建好项目,并集成了getx

一 使用getx的命令行工具创建tab页面

  1. 创建底部tab
 get create page:tabs

在这里插入图片描述 2. 创建tab所属的页面

也就是首页、购物车、我的,首页默认创建了,就不需要重复创建

 get create page:user

在这里插入图片描述

当前项目架构
在这里插入图片描述

二 将页面与tab关联

  1. 因为我们其实首先进入的不是home,而是tabs,所以呢,我们将路由里的所有除tabs以外的页面都删除

lib\\app\\routes\\app_pages.dart页面修改如下:

import 'package:get/get.dart';
import '../modules/tabs/bindings/tabs_binding.dart';
import '../modules/tabs/views/tabs_view.dart';
part 'app_routes.dart';

class AppPages {
  AppPages._();
  static const INITIAL = Routes.TABS; //注意这里要改成tabs,本来入口是home
  static final routes = [
    GetPage(
      name: _Paths.TABS,
      page: () => const TabsView(),
      binding: TabsBinding(),
    ),
  ];
}

lib\\app\\routes\\app_routes.dart页面修改如下:

part of 'app_pages.dart';

abstract class Routes {
  Routes._();
  static const TABS = _Paths.TABS;
}

abstract class _Paths {
  _Paths._();
  static const TABS = '/tabs';

}

这里无法理解的,可以按下图来理解
我们原本以为的:

打开APP
进入主页home

实际上是:

打开APP
进入tabs
进入tabs默认页面home
  1. 你可能会急,但是你别急,我知道,你发现还是没有任何变化,所以呢,接下来做的就很重要了

修改 lib\app\modules\tabs\\views\\tabs_view.dart文件

import 'package:flutter/material.dart';

import 'package:get/get.dart';

import '../controllers/tabs_controller.dart';

class TabsView extends GetView<TabsController> {
  const TabsView({Key? key}) : super(key: key);
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('TabsView'),
        centerTitle: true,
      ),
      body: const Center(
        child: Text(
          'TabsView is working',
          style: TextStyle(fontSize: 20),
        ),
      ),
      //从这开始是新增的【bottomNavigationBar】,我们先将底部的ICON和名称设置一下
      //按照你的UI,将下面的内容
      bottomNavigationBar: BottomNavigationBar(
        fixedColor: Colors.red, //选中的颜色
        currentIndex: 0, //第几个菜单选中
        type: BottomNavigationBarType.fixed, //如果有4个或者4个以上的
        onTap: (index) {},
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: "首页",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.shopping_cart),
            label: "购物车",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.people),
            label: "用户",
          ),
        ],
      ),
    );
  }
}

现在,你run一下,是不是底部的tab栏已经出现了,但是你发现,切换是没有效果的,那怎么办呢?

  1. 实现tab栏切换效果

修改lib\app\modules\tabs\\controllers\\tabs_controller.dart

import 'package:get/get.dart';

class TabsController extends GetxController {
  //TODO: Implement TabsController
  
  RxInt currentIndex = 0.obs; //步骤3新增:新建一个变量,用于监听哪一个被选中
  
  void onInit() {
    super.onInit();
  }

  
  void onClose() {
    super.onClose();
  }

  /// 步骤3新增: 更新被选中的值
  void setCurrentIndex(index){
  	//将index赋值给currentIndex,并刷新数据
    currentIndex.value = index;
    update();
  }
}

修改 lib\app\modules\tabs\\views\\tabs_view.dart

import 'package:flutter/material.dart';

import 'package:get/get.dart';

import '../controllers/tabs_controller.dart';

class TabsView extends GetView<TabsController> {
  const TabsView({Key? key}) : super(key: key);
  
  Widget build(BuildContext context) {
   //步骤3新增:使用Obx 包裹Scaffold.用于监听数据变化
    return Obx(() => Scaffold(
      appBar: AppBar(
        title: const Text('TabsView'),
        centerTitle: true,
      ),
      body: const Center(
        child: Text(
          'TabsView is working',
          style: TextStyle(fontSize: 20),
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        fixedColor: Colors.red,
        currentIndex: controller.currentIndex.value, //步骤3新增:第几个菜单选中
        type: BottomNavigationBarType.fixed, //如果有4个或者4个以上的
        onTap: (index) {
        //步骤3新增:将当前选中的赋值给变量
          controller.setCurrentIndex(index);
        },
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: "首页",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.shopping_cart),
            label: "购物车",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.people),
            label: "用户",
          ),
        ],
      ),
    ));
  }
}


现在,你发现底部的tab栏可以了,但是呢,界面没有变化,

  1. 实现tab栏与主页面的绑定

修改lib\app\modules\tabs\\controllers\\tabs_controller.dart

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

import '../../cart/views/cart_view.dart';
import '../../home/views/home_view.dart';
import '../../user/views/user_view.dart';

class TabsController extends GetxController {
  //TODO: Implement TabsController

  RxInt currentIndex = 0.obs; //新建一个变量,用于监听哪一个被选中
  //步骤4新增:将页面放在List里,切换页面就是用下标选中当前页面切换,注意,每一个页面的顺序要和底部对应
  final List<Widget> pages = const [
    HomeView(),
    CartView(),
    UserView(),
  ];

  
  void onInit() {
    super.onInit();
  }

  
  void onClose() {
    super.onClose();
  }

  /// 更新被选中的值
  void setCurrentIndex(index){
    currentIndex.value = index;
    update();
  }
}

修改 lib\app\modules\tabs\\views\\tabs_view.dart

import 'package:flutter/material.dart';

import 'package:get/get.dart';

import '../controllers/tabs_controller.dart';

class TabsView extends GetView<TabsController> {
  const TabsView({Key? key}) : super(key: key);
  
  Widget build(BuildContext context) {
    return Obx(() => Scaffold(
      appBar: AppBar(
        title: const Text('TabsView'),
        centerTitle: true,
      ),
      //步骤4新增:将Body的内容用主页面代替
      body: controller.pages[controller.currentIndex.value],
      bottomNavigationBar: BottomNavigationBar(
        fixedColor: Colors.red,
        currentIndex: controller.currentIndex.value, //第几个菜单选中
        type: BottomNavigationBarType.fixed, //如果有4个或者4个以上的
        onTap: (index) {
          controller.setCurrentIndex(index);
        },
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: "首页",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.shopping_cart),
            label: "购物车",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.people),
            label: "用户",
          ),
        ],
      ),
    ));
  }
}

这个时候你发现,tab栏切换和页面是同步的,此时,基本上大部分完成了,接下来,我们修改BUG和点缀一下

三 修改BUG:为什么有两个标题栏???

这里很简单,我们要用的仅仅是主页面的标题栏,不需要tabs标题栏,把它删了即可!
修改 lib\app\modules\tabs\\views\\tabs_view.dart

 return Obx(() => Scaffold(
 	 //删除这里的appBar即可
     // appBar: AppBar(
     //   title: const Text('TabsView'),
     //   centerTitle: true,
     // ),
     
      body: controller.pages[controller.currentIndex.value],
      bottomNavigationBar: BottomNavigationBar(

OK。问题解决了

四 实际开发时,还需要进行的一些操作

  1. 将几个主页面的controller放在tabs_binding进行懒加载,用于一些数据传输,状态管理等工作

修改 lib\app\modules\tabs\\bindings\\tabs_binding.dart

import 'package:get/get.dart';

import '../../cart/controllers/cart_controller.dart';
import '../../home/controllers/home_controller.dart';
import '../../user/controllers/user_controller.dart';
import '../controllers/tabs_controller.dart';

class TabsBinding extends Bindings {
  
  void dependencies() {
    Get.lazyPut<TabsController>(
      () => TabsController(),
    );
    //在这里进行懒加载
    Get.lazyPut<HomeController>(
          () => HomeController(),
    );
    Get.lazyPut<CartController>(
          () => CartController(),
    );
    Get.lazyPut<UserController>(
          () => UserController(),
    );
  }
}

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,让我们来实战一下 Flutter GetX。 1. 首先,我们需要在 `pubspec.yaml` 文件添加 GetX 的依赖。 ```yaml dependencies: flutter: sdk: flutter get: ^4.6.1 ``` 2. 然后,我们需要在 `main.dart` 文件引入 GetX 包,并在 `runApp` 函数添加 `GetMaterialApp`。 ```dart import 'package:flutter/material.dart'; import 'package:get/get.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return GetMaterialApp( title: 'Flutter GetX Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const HomePage(), ); } } ``` 3. 接下来,我们需要创建一个 `HomePage` 类,这个类将会是我们的主页。在 `HomePage` 类,我们将会使用 `GetX` 的 `Obx` 和 `GetBuilder` 来管理状态和更新 UI。 ```dart import 'package:flutter/material.dart'; import 'package:get/get.dart'; class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Flutter GetX Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ GetBuilder<CounterController>( builder: (controller) => Text( 'Count: ${controller.count}', style: const TextStyle(fontSize: 24), ), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { final controller = Get.find<CounterController>(); controller.increment(); }, child: const Text('Increment'), ), ], ), ), ); } } class CounterController extends GetxController { var count = 0.obs; void increment() { count++; } } ``` 在这个例子,我们使用了 `GetBuilder` 来订阅 `CounterController` 的 `count` 变量。当 `count` 发生变化时,UI 将会自动更新。我们还使用了 `Get.find` 来获取 `CounterController` 的实例,然后调用 `increment` 方法来增加计数器的值。 4. 最后,我们需要在 `main.dart` 文件注册 `CounterController`。 ```dart import 'package:flutter/material.dart'; import 'package:get/get.dart'; void main() { Get.put(CounterController()); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return GetMaterialApp( title: 'Flutter GetX Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const HomePage(), ); } } class HomePage extends StatelessWidget { // ... } class CounterController extends GetxController { // ... } ``` 在这个例子,我们使用了 `Get.put` 来注册 `CounterController`,这样我们就可以在整个应用程序使用它了。 以上就是一个简单的 Flutter GetX 实战例子,希望能够帮助到你入门 GetX。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Call me 兽医

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值