問題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,擴充套件的value與label用於表示實際與後臺約束的值 與 顯示值
在實際使用過程中其實是用不到value的,只是要在傳輸給後臺時候,要將Status列舉型別轉換成後臺真正的值;和從後臺請求下來的值解析成flutter中使用的列舉型別
結束語
提供一個思路,有其他思路請留言。另外,各位看官走過路過,點贊不要錯過~~ ?