Reason Pun

增加了口音选择弹出菜单

[
{
"id": 1,
"bankName": "民生银行",
"firstLetter": "M"
},
{
"id": 2,
"bankName": "工商银行",
"firstLetter": "G"
},
{
"id": 3,
"bankName": "农业银行",
"firstLetter": "N"
},
{
"id": 4,
"bankName": "中国银行",
"firstLetter": "Z"
},
{
"id": 5,
"bankName": "建设银行",
"firstLetter": "J"
},
{
"id": 6,
"bankName": "交通银行",
"firstLetter": "J"
},
{
"id": 7,
"bankName": "中信银行",
"firstLetter": "Z"
},
{
"id": 8,
"bankName": "招商银行",
"firstLetter": "Z"
},
{
"id": 9,
"bankName": "兴业银行",
"firstLetter": "X"
},
{
"id": 10,
"bankName": "浦发银行",
"firstLetter": "P"
},
{
"id": 16,
"bankName": "光大银行",
"firstLetter": "G"
},
{
"id": 17,
"bankName": "华夏银行",
"firstLetter": "H"
},
{
"id": 18,
"bankName": "广发银行",
"firstLetter": "G"
},
{
"id": 19,
"bankName": "平安银行",
"firstLetter": "P"
},
{
"id": 20,
"bankName": "北京银行",
"firstLetter": "B"
},
{
"id": 43,
"bankName": "上海银行",
"firstLetter": "S"
},
{
"id": 44,
"bankName": "南京银行",
"firstLetter": "N"
},
{
"id": 48,
"bankName": "杭州银行",
"firstLetter": "H"
},
{
"id": 49,
"bankName": "宁波银行",
"firstLetter": "N"
},
{
"id": 54,
"bankName": "浙江稠州商业银行",
"firstLetter": "Z"
},
{
"id": 83,
"bankName": "汉口银行",
"firstLetter": "H"
},
{
"id": 84,
"bankName": "长沙银行",
"firstLetter": "C"
},
{
"id": 116,
"bankName": "浙商银行",
"firstLetter": "Z"
},
{
"id": 118,
"bankName": "渤海银行",
"firstLetter": "B"
},
{
"id": 127,
"bankName": "上海农商银行",
"firstLetter": "S"
},
{
"id": 128,
"bankName": "北京农商行",
"firstLetter": "B"
},
{
"id": 143,
"bankName": "中国邮储银行",
"firstLetter": "Y"
}
]
\ No newline at end of file
[
{
"id": 13035,
"bankName": "西安市城南支行",
"firstLetter": "X"
},
{
"id": 13036,
"bankName": "西安经济技术开发区支行",
"firstLetter": "X"
},
{
"id": 13037,
"bankName": "西安市东新街支行",
"firstLetter": "X"
},
{
"id": 13038,
"bankName": "西安南大街支行",
"firstLetter": "X"
},
{
"id": 13039,
"bankName": "西安市解放路支行",
"firstLetter": "X"
},
{
"id": 13040,
"bankName": "西安市太华路支行",
"firstLetter": "X"
},
{
"id": 13041,
"bankName": "西安民乐园支行",
"firstLetter": "X"
},
{
"id": 13042,
"bankName": "西安市东大街支行",
"firstLetter": "X"
},
{
"id": 13043,
"bankName": "西安南院门支行",
"firstLetter": "X"
},
{
"id": 13044,
"bankName": "西安东关支行",
"firstLetter": "X"
},
{
"id": 13045,
"bankName": "西安和平路支行",
"firstLetter": "X"
},
{
"id": 13046,
"bankName": "西安互助路支行",
"firstLetter": "X"
},
{
"id": 13047,
"bankName": "西安市北大街支行",
"firstLetter": "X"
},
{
"id": 13048,
"bankName": "西安西大街支行",
"firstLetter": "X"
},
{
"id": 13049,
"bankName": "西安星火路支行",
"firstLetter": "X"
},
{
"id": 13050,
"bankName": "西安市南关支行",
"firstLetter": "X"
},
{
"id": 13051,
"bankName": "西安小寨支行",
"firstLetter": "X"
},
{
"id": 13052,
"bankName": "西安雁塔路支行",
"firstLetter": "X"
},
{
"id": 13053,
"bankName": "西安含光路支行",
"firstLetter": "X"
},
{
"id": 13054,
"bankName": "西安铁路局支行",
"firstLetter": "X"
},
{
"id": 13055,
"bankName": "西安电子工业区支行",
"firstLetter": "X"
},
{
"id": 13056,
"bankName": "西安大雁塔支行",
"firstLetter": "X"
},
{
"id": 13057,
"bankName": "西安市土门支行",
"firstLetter": "X"
},
{
"id": 13058,
"bankName": "西安市纺织城支行",
"firstLetter": "X"
},
{
"id": 13059,
"bankName": "西安市韩森寨支行",
"firstLetter": "X"
},
{
"id": 13060,
"bankName": "西安咸宁路支行",
"firstLetter": "X"
},
{
"id": 13061,
"bankName": "西安市韩森寨支行万寿路分理处",
"firstLetter": "X"
},
{
"id": 13062,
"bankName": "西安市阎良区支行",
"firstLetter": "X"
},
{
"id": 13063,
"bankName": "西安市周至县支行",
"firstLetter": "X"
},
{
"id": 13064,
"bankName": "西安市户县支行",
"firstLetter": "X"
},
{
"id": 13065,
"bankName": "西安市临潼区支行",
"firstLetter": "X"
},
{
"id": 13066,
"bankName": "西安市高新技术开发区支行",
"firstLetter": "X"
},
{
"id": 13067,
"bankName": "西安劳动南路支行",
"firstLetter": "X"
},
{
"id": 13068,
"bankName": "西安市未央支行",
"firstLetter": "X"
},
{
"id": 13069,
"bankName": "西安徐家湾支行",
"firstLetter": "X"
},
{
"id": 17731,
"bankName": "西安莲湖路支行",
"firstLetter": "X"
},
{
"id": 17747,
"bankName": "陕西省西安凤城八路分理处",
"firstLetter": "S"
},
{
"id": 17748,
"bankName": "西安长乐中路支行",
"firstLetter": "X"
},
{
"id": 17749,
"bankNumber": "102791013020",
"bankName": "陕西省西安咸宁中路支行",
"firstLetter": "S"
},
{
"id": 17750,
"bankName": "西安万寿南路分理处",
"firstLetter": "X"
},
{
"id": 17759,
"bankName": "陕西省西安紫薇田园都市分理处",
"firstLetter": "S"
}
]
\ No newline at end of file
This diff is collapsed. Click to expand it.
[
{
"id": "1",
"name": "超市便利"
},
{
"id": "2",
"name": "生鲜果蔬"
},
{
"id": "3",
"name": "零食小吃"
},
{
"id": "4",
"name": "美食餐饮"
},
{
"id": "5",
"name": "鲜花烘培"
},
{
"id": "6",
"name": "生活服务"
},
{
"id": "7",
"name": "其他"
},
{
"id": "8",
"name": "综合"
},
{
"id": "10",
"name": "美容个护"
},
{
"id": "11",
"name": "家居生活"
},
{
"id": "12",
"name": "服饰箱包"
},
{
"id": "13",
"name": "母婴玩具"
},
{
"id": "15",
"name": "海淘进口"
},
{
"id": "755",
"name": "快递代收"
},
{
"id": "756",
"name": "食品保健"
},
{
"id": "764",
"name": "家居生活"
},
{
"id": "769",
"name": "米面杂粮"
},
{
"id": "786",
"name": "水果生鲜"
},
{
"id": "807",
"name": "社区健身"
},
{
"id": "811",
"name": "艺术礼品"
},
{
"id": "814",
"name": "今日特卖"
},
{
"id": "816",
"name": "周边旅游"
},
{
"id": "820",
"name": "家装建材"
},
{
"id": "823",
"name": "虚拟商品"
},
{
"id": "14057",
"name": "生活用品"
},
{
"id": "14181",
"name": "手机数码"
}
]
\ No newline at end of file
[
{
"id": "15677",
"name": "厨房用具"
},
{
"id": "15690",
"name": "精美餐具"
},
{
"id": "15698",
"name": "家纺"
},
{
"id": "15717",
"name": "家具"
},
{
"id": "15740",
"name": "灯具"
},
{
"id": "15755",
"name": "生活日用"
},
{
"id": "15765",
"name": "宠物用品"
},
{
"id": "15773",
"name": "家装建材"
},
{
"id": "15795",
"name": "赠品"
},
{
"id": "15797",
"name": "家装软饰"
},
{
"id": "15814",
"name": "收纳用品"
},
{
"id": "26541",
"name": "演出票务"
},
{
"id": "26551",
"name": "健康体检"
},
{
"id": "26554",
"name": "教育培训"
},
{
"id": "26561",
"name": "汽车保养"
},
{
"id": "26563",
"name": "影视会员"
},
{
"id": "26565",
"name": "摄影、摄像"
}
]
\ No newline at end of file
[
{
"id": "15691",
"name": "酒具/杯具"
},
{
"id": "15692",
"name": "水具"
},
{
"id": "15693",
"name": "筷勺/刀叉"
},
{
"id": "15694",
"name": "碗碟"
},
{
"id": "15695",
"name": "组合套装"
},
{
"id": "15696",
"name": "美食工具"
},
{
"id": "15697",
"name": "茶具/咖啡具"
}
]
\ No newline at end of file
[
{
"id": "1",
"name": "普通话"
},
{
"id": "2",
"name": "四川话"
},
{
"id": "3",
"name": "山东话"
},
{
"id": "4",
"name": "闽南话"
},
{
"id": "5",
"name": "东北话"
}
]
\ No newline at end of file
......@@ -4,8 +4,15 @@
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
import 'package:one_poem/account/models/user_entity.dart';
import 'package:one_poem/generated/json/user_entity.g.dart';
import 'package:one_poem/category/models/category_item_entity.dart';
import 'package:one_poem/generated/json/category_item_entity.g.dart';
import 'package:one_poem/poem/models/lang_sort_entity.dart';
import 'package:one_poem/generated/json/lang_sort_entity.g.dart';
import 'package:one_poem/poem/models/search_entity.dart';
import 'package:one_poem/generated/json/search_entity.g.dart';
import 'package:one_poem/timeline/models/friend_entity.dart';
import 'package:one_poem/generated/json/friend_entity.g.dart';
JsonConvert jsonConvert = JsonConvert();
......@@ -82,6 +89,21 @@ class JsonConvert {
if(type == (CategoryItemEntity).toString()){
return CategoryItemEntity.fromJson(json) as M;
}
if(type == (LangSortEntity).toString()){
return LangSortEntity.fromJson(json) as M;
}
if(type == (SearchEntity).toString()){
return SearchEntity.fromJson(json) as M;
}
if(type == (SearchItems).toString()){
return SearchItems.fromJson(json) as M;
}
if(type == (SearchItemsOwner).toString()){
return SearchItemsOwner.fromJson(json) as M;
}
if(type == (SearchItemsLicense).toString()){
return SearchItemsLicense.fromJson(json) as M;
}
if(type == (FriendEntity).toString()){
return FriendEntity.fromJson(json) as M;
}
......@@ -102,6 +124,21 @@ class JsonConvert {
if(<CategoryItemEntity>[] is M){
return data.map<CategoryItemEntity>((Map<String, dynamic> e) => CategoryItemEntity.fromJson(e)).toList() as M;
}
if(<LangSortEntity>[] is M){
return data.map<LangSortEntity>((Map<String, dynamic> e) => LangSortEntity.fromJson(e)).toList() as M;
}
if(<SearchEntity>[] is M){
return data.map<SearchEntity>((Map<String, dynamic> e) => SearchEntity.fromJson(e)).toList() as M;
}
if(<SearchItems>[] is M){
return data.map<SearchItems>((Map<String, dynamic> e) => SearchItems.fromJson(e)).toList() as M;
}
if(<SearchItemsOwner>[] is M){
return data.map<SearchItemsOwner>((Map<String, dynamic> e) => SearchItemsOwner.fromJson(e)).toList() as M;
}
if(<SearchItemsLicense>[] is M){
return data.map<SearchItemsLicense>((Map<String, dynamic> e) => SearchItemsLicense.fromJson(e)).toList() as M;
}
if(<FriendEntity>[] is M){
return data.map<FriendEntity>((Map<String, dynamic> e) => FriendEntity.fromJson(e)).toList() as M;
}
......
import 'package:one_poem/generated/json/base/json_convert_content.dart';
import 'package:one_poem/poem/models/lang_sort_entity.dart';
LangSortEntity $LangSortEntityFromJson(Map<String, dynamic> json) {
final LangSortEntity langSortEntity = LangSortEntity();
final String? id = jsonConvert.convert<String>(json['id']);
if (id != null) {
langSortEntity.id = id;
}
final String? name = jsonConvert.convert<String>(json['name']);
if (name != null) {
langSortEntity.name = name;
}
return langSortEntity;
}
Map<String, dynamic> $LangSortEntityToJson(LangSortEntity entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = entity.id;
data['name'] = entity.name;
return data;
}
\ No newline at end of file
This diff is collapsed. Click to expand it.
import 'dart:convert';
import 'package:one_poem/generated/json/base/json_field.dart';
import 'package:one_poem/generated/json/lang_sort_entity.g.dart';
@JsonSerializable()
class LangSortEntity {
String? id;
String? name;
LangSortEntity();
factory LangSortEntity.fromJson(Map<String, dynamic> json) => $LangSortEntityFromJson(json);
Map<String, dynamic> toJson() => $LangSortEntityToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:one_poem/poem/provider/lang_sort_provider.dart';
import 'package:one_poem/poem/widgets/lang_sort_bottom_sheet.dart';
import 'package:one_poem/res/resources.dart';
import 'package:one_poem/routers/fluro_navigator.dart';
import 'package:one_poem/routers/routers.dart';
import 'package:one_poem/widgets/click_item.dart';
import 'package:one_poem/widgets/my_app_bar.dart';
import 'package:one_poem/extension/int_extension.dart';
......@@ -19,6 +22,9 @@ class PoemPublish extends StatefulWidget {
class _PoemPublishState extends State<PoemPublish> {
bool isPublishing = false;
String _langSortName = "普通话";
int _langSortId = 1;
final LangSortProvider _provider = LangSortProvider();
@override
void initState() {
......@@ -28,6 +34,7 @@ class _PoemPublishState extends State<PoemPublish> {
@override
void dispose() {
super.dispose();
_provider.dispose();
}
@override
......@@ -94,28 +101,42 @@ class _PoemPublishState extends State<PoemPublish> {
],
),
),
Container(
padding: EdgeInsets.all(10.px),
alignment: Alignment.centerLeft,
width: double.infinity,
height: 36.px,
child: Wrap(
children: [
Icon(
Icons.record_voice_over_outlined,
size: 15.px,
),
Gaps.hGap5,
const Text(
"所用口音",
style: TextStyle(color: Colors.black45),
),
Gaps.hGap10,
const Text(
"普通话",
style: TextStyle(color: Colors.black45),
),
],
InkWell(
onTap: () {
showModalBottomSheet<void>(
context: context,
isScrollControlled: true,
builder: (BuildContext context) {
return LangSortBottomSheet(
provider: _provider,
onSelected: (id, name) {
setState(() {
_langSortId = int.parse(id);
_langSortName = name;
});
},
);
},
);
},
child: Container(
padding: EdgeInsets.all(10.px),
alignment: Alignment.centerLeft,
width: double.infinity,
height: 36.px,
child: Wrap(
children: [
Icon(
Icons.record_voice_over_outlined,
size: 15.px,
),
Gaps.hGap5,
Text(
"所用口音 $_langSortName",
style: const TextStyle(color: Colors.black45),
),
],
),
),
),
const Spacer(),
......
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:one_poem/generated/json/base/json_convert_content.dart';
import 'package:one_poem/poem/models/lang_sort_entity.dart';
class LangSortProvider extends ChangeNotifier {
int _index = 0;
int get index => _index;
List<LangSortEntity> _mLangSort = [];
/// 当前列表数据
List<LangSortEntity> _mList = [];
List<LangSortEntity> get mList => _mList;
/// 三级联动选择的position
final List<int> _positions = [0];
List<int> get positions => _positions;
void setIndex(int index) {
_index = index;
notifyListeners();
}
void indexIncrement() {
_index++;
}
void setList(int index) {
switch (index) {
case 0:
_mList = _mLangSort;
break;
}
}
void initData() {
if (_mList.isNotEmpty) {
return;
}
rootBundle.loadString('assets/data/lang.json').then((String value) {
_mLangSort =
JsonConvert.fromJsonAsT<List<LangSortEntity>>(json.decode(value)) ??
[];
_mList = _mLangSort;
notifyListeners();
});
}
}
import 'package:flutter/material.dart';
import 'package:one_poem/poem/provider/lang_sort_provider.dart';
import 'package:one_poem/res/resources.dart';
import 'package:one_poem/routers/fluro_navigator.dart';
import 'package:provider/provider.dart';
import 'package:one_poem/util/screen_utils.dart';
class LangSortBottomSheet extends StatefulWidget {
const LangSortBottomSheet({
Key? key,
required this.provider,
required this.onSelected,
}) : super(key: key);
final Function(String, String) onSelected;
/// 临时状态
final LangSortProvider provider;
@override
LangSortBottomSheetState createState() => LangSortBottomSheetState();
}
class LangSortBottomSheetState extends State<LangSortBottomSheet>
with SingleTickerProviderStateMixin {
final ScrollController _controller = ScrollController();
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) {
widget.provider.initData();
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
child: SizedBox(
height: context.height * 11.0 / 16.0,
/// 为保留状态,选择ChangeNotifierProvider.value,销毁自己手动处理(见 goods_edit_page.dart :dispose())
child: ChangeNotifierProvider<LangSortProvider>.value(
value: widget.provider,
child: Consumer<LangSortProvider>(
builder: (_, provider, child) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
child!,
Gaps.line,
Expanded(
child: ListView.builder(
controller: _controller,
itemExtent: 48.0,
itemBuilder: (_, index) {
return _buildItem(provider, index);
},
itemCount: provider.mList.length,
),
)
],
);
},
child: Stack(
children: <Widget>[
Container(
width: double.infinity,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: const Text(
'请选择口音',
style: TextStyles.textBold16,
),
),
Positioned(
right: 16.0,
top: 16.0,
bottom: 16.0,
child: InkWell(
onTap: () => NavigatorUtils.goBack(context),
child: const SizedBox(
height: 16.0,
width: 16.0,
child: Icon(Icons.close),
),
),
)
],
),
),
),
),
);
}
Widget _buildItem(LangSortProvider provider, int index) {
return InkWell(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
alignment: Alignment.centerLeft,
child: Row(
children: <Widget>[
Text(
provider.mList[index].name!,
style: const TextStyle(
fontSize: Dimens.font_sp14,
color: Colors.black45,
),
),
],
),
),
onTap: () {
widget.onSelected(
provider.mList[index].id!, provider.mList[index].name!);
NavigatorUtils.goBack(context);
_controller.animateTo(
0.0,
duration: const Duration(milliseconds: 100),
curve: Curves.ease,
);
},
);
}
}