Flutter GetX Tag 屬性使用詳解

會煮咖啡的貓發表於2023-05-12

Flutter GetX Tag 屬性使用詳解

瞭解 Flutter GetX Tag 屬性的定義、用途、實現方式和常見問題。

<img src="https://ducafecat.oss-cn-beijing.aliyuncs.com/podcast/2023/05/5348fa28c99630c08bc1d42d2ecfde65.jpeg" style="width:90%;" />

前言

Flutter中,GetX是一款非常流行的狀態管理庫。它不僅提供了狀態管理的功能,還有路由、依賴注入和許多其他功能。在這篇文章中,我將介紹如何在Flutter中正確使用GetX的標籤(Tag)功能。

很多同學在問我 Getx 問題的時候,我發現都對 tag 屬性不清楚,今天我們就來講一講。

影片

https://www.bilibili.com/video/BV1eP411R7ft/

知識點

在 Flutter GetX 中,tag 屬性是用於標識控制器(Controller)例項的字串,具體作用如下:

區分不同的控制器例項

在一個 Flutter GetX 應用程式中,可能會存在多個相同型別的控制器例項,例如多個頁面使用相同的資料控制器。使用 tag 屬性可以為不同的控制器例項分配不同的標識,以便在不同的頁面中使用不同的控制器例項。

儲存控制器狀態

使用 tag 屬性可以為控制器例項分配唯一的標識,以便在應用程式生命週期中儲存控制器的狀態。例如,在頁面切換時,可以透過 tag 屬性儲存當前頁面的控制器狀態,以便在頁面重新開啟時恢復控制器狀態。

避免控制器重複建立

使用 tag 屬性可以避免相同型別的控制器例項重複建立。例如,在多個頁面中使用相同的資料控制器時,使用相同的 tag 標識可以確保只建立一個控制器例項,以減少資源的消耗。

正文

<img src="https://ducafecat.oss-cn-beijing.aliyuncs.com/podcast/2023/05/e90ff886f51d46e6f971bdda8fd8b2c2.png" style="width:50%;" />

如果不設定 tag 將使用相同的控制器

控制器

lib/pages/post_detail/controller.dart

import 'package:get/get.dart';

import 'index.dart';

class PostDetailController extends GetxController {
  PostDetailController();

  int num = 0;

  _initData() {
    update(["post_detail"]);
  }

  void onTap() {
    num++;
    update(["post_detail"]);
  }

  void onNextPage() {
    // 當前時間戳
    final int timestamp = DateTime.now().millisecondsSinceEpoch;
    Get.to(PostDetailPage(),
        routeName: "/post/$timestamp", arguments: {"timestamp": "$timestamp"});
  }

  @override
  void onReady() {
    super.onReady();
    _initData();
  }
}

檢視

lib/pages/post_detail/view.dart

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

import 'index.dart';

class PostDetailPage extends GetView<PostDetailController> {
  PostDetailPage({Key? key}) : super(key: key);

  final String timestamp = Get.arguments?["timestamp"] ??
      DateTime.now().millisecondsSinceEpoch.toString();

  // 主檢視
  Widget _buildView() {
    return Center(
      child: Column(
        children: [
          Text("計數 num : ${controller.num}"),
          ElevatedButton(
            onPressed: controller.onTap,
            child: const Text("加法計算"),
          ),
          ElevatedButton(
            onPressed: controller.onNextPage,
            child: const Text("再開一個介面"),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<PostDetailController>(
      init: PostDetailController(),
      id: "post_detail",
      builder: (_) {
        return Scaffold(
          appBar: AppBar(title: Text("post_detail $timestamp")),
          body: SafeArea(
            child: _buildView(),
          ),
        );
      },
    );
  }
}

加入 tag 屬性就能區分不同控制器

控制器

lib/pages/post_detail/controller.dart

import 'package:get/get.dart';

import 'index.dart';

class PostDetailController extends GetxController {
  PostDetailController();

  int num = 0;

  _initData() {
    update(["post_detail"]);
  }

  void onTap() {
    num++;
    update(["post_detail"]);
  }

  void onNextPage() {
    // 當前時間戳
    final int timestamp = DateTime.now().millisecondsSinceEpoch;
    Get.to(PostDetailPage(),
        routeName: "/post/$timestamp", arguments: {"timestamp": "$timestamp"});
  }

  @override
  void onReady() {
    super.onReady();
    _initData();
  }
}

檢視

lib/pages/post_detail/view.dart

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

import 'index.dart';

class PostDetailPage extends GetView<PostDetailController> {
  PostDetailPage({Key? key}) : super(key: key);

  final String timestamp = Get.arguments?["timestamp"] ??
      DateTime.now().millisecondsSinceEpoch.toString();

  @override
  String? get tag => timestamp;

  // 主檢視
  Widget _buildView() {
    return Center(
      child: Column(
        children: [
          Text("計數 num : ${controller.num}"),
          ElevatedButton(
            onPressed: controller.onTap,
            child: const Text("加法計算"),
          ),
          ElevatedButton(
            onPressed: controller.onNextPage,
            child: const Text("再開一個介面"),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<PostDetailController>(
      init: PostDetailController(),
      tag: timestamp,
      id: "post_detail",
      builder: (_) {
        return Scaffold(
          appBar: AppBar(title: Text("post_detail $timestamp")),
          body: SafeArea(
            child: _buildView(),
          ),
        );
      },
    );
  }
}

程式碼

https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_application_getx_tag

小結

在Flutter中使用GetX的標籤(Tag)功能可以區分不同的控制器例項、儲存控制器狀態和避免控制器重複建立。在本文中,貓哥介紹瞭如何正確使用GetX的標籤功能,以及如何在Flutter GetX中使用tag屬性來標識控制器例項。


© 貓哥
ducafecat.com

end

本文由mdnice多平臺釋出

相關文章