Flutter Dart語言中列舉型別不支援以中文作為鍵名與不能自定義index不從0開始的解決辦法

熱愛學習發表於2021-05-26

問題1:Dart 不支援中文做key

enum CostType {
  /// 按平方
  BySquare,
  /// 按長度
  ByLength,
  /// 按重量
  ByWeight,
  /// 按數量
  ByNum,
}

extension CostTypeExtension on CostType {
  static const labels = ["按平方", "按長度", "按重量", "按數量"];

  /// 前臺展示的值
  String get label => labels[this.index];
  /// 解析從後臺傳來的值
  static FeeType parse(int i) {
    return FeeType.values[i];
  }
  /// 解析從後臺傳來的中文Label值
  static FeeType parseLabel(String label) {
    int index = labels.indexOf(label);
    if (index == -1) throw FormatException('Label不在可接受範圍內');
    return parse(index);
  }
}

複製程式碼

通過給列舉擴充套件,讓他可以儲存中文

使用的時候

  • 解析後臺傳過來的值 costType: json["costType"] != null? CostTypeExtension.parse(json["costType"]): null
  • flutter展示,比如select中做items,可直接用CostTypeExtension.labels
  • 獲取當前列舉型別的中文含義,CostType.BySquare.label == "按平方"

問題2:Dart語言中的列舉型別不能自由定義列舉從幾開始

比如我想讓列舉從-1開始代表已取消狀態,dart不支援,或者我不想從0開始,直接從1開始

import 'package:flutter/material.dart';
enum Status {
  /// 待傳送
  ToBeSent,
  /// 已傳送
  HasBeenSent,
  /// 已接收
  Received,
  /// 已回覆
  Replied,
  /// 已取消
  Canceled,
}

extension StatusExtension on Status {
  static const List<int> values = [0, 1, 2, 3, -1];
  static const List<String> labels = [
    "待傳送",
    "已傳送",
    "已接收",
    "已回覆",
    "已取消"
  ];
  static const List<Color> colors = [
    Color(0xffb4b4b4),
    Color(0xfff79d8c),
    Color(0xff00b9f1),
    Color(0xff2699f6),
    Color(0xff75d239),
  ];
  /// 真正後臺想要的值
  int get value => values[this.index];
  /// 展示文字
  String get label => labels[this.index];
  /// 展示顏色
  Color get color => colors[this.index];
  /// 解析從後臺傳來的值
  static Status parse(int i) {
    if (i == -1) return Status.Canceled;
    return Status.values[i];
  }
}
複製程式碼

這樣寫的話,他就擁有了3中型別的屬性(不包括color),即原有的index,擴充套件的valuelabel用於表示實際與後臺約束的值顯示值

在實際使用過程中其實是用不到value的,只是要在傳輸給後臺時候,要將Status列舉型別轉換成後臺真正的值;和從後臺請求下來的值解析成flutter中使用的列舉型別

結束語

提供一個思路,有其他思路請留言。另外,各位看官走過路過,點贊不要錯過~~ ?

相關文章