关于flutter_picker多列使用map数组,我要如何显示呀?

static void TwoPicker(context, {
    required List<dynamic> list,
    required Function onConfirm,
    List<int>? selecteds
  }){

    print(list);

    Picker picker = Picker(
        adapter: PickerDataAdapter(
          pickerdata: list,
          isArray: true
        ),

        changeToFirst: false,
        textAlign: TextAlign.left,
        cancelText: "取消",
        confirmText: "确定",
        cancelTextStyle: const TextStyle(color: Colors.grey),
        confirmTextStyle: TextStyle(color: ColorConst.mainColor),
        selecteds: selecteds,
        itemExtent: 40, 
        textStyle: const TextStyle(color: Colors.black, fontSize: 16),
        // selectedTextStyle: TextStyle(color: Colors.red),
        columnPadding: const EdgeInsets.all(5),
        onConfirm: (Picker picker, List value) {
          // print(value.toString());
          // print(picker.getSelectedValues());
          if(list[0] == null || value[0] == null){
            onConfirm(null);
          }else{
            onConfirm(list[value[0]]);
          }
        });
    picker.showModal(context);
  }

其中list是这样的数据,[[{name:'',value:''},{name:'',value:''}],[{name:'',value:''}]]
image.png
效果是
image.png
我要怎么使用name字段作为显示呀?

阅读 2.7k
1 个回答

查阅源码,发现在Picker.dart中有个_parseArrayPickerDataItem方法,此方式是设置PickerItem的。将其拿出来改写,如下:

static _parseArrayPickerDataItem(List? pickerData, List<PickerItem> data) {
      if (pickerData == null) return;
      var len = pickerData.length;
      
      for (int i = 0; i < len; i++) {
        var v = pickerData[i];
        if (v is! List) continue;
        List lv = v;
        if (lv.isEmpty) continue;

        PickerItem item = PickerItem(children: <PickerItem>[]);
        data.add(item);

        for (int j = 0; j < lv.length; j++) {
          var o = lv[j];
          item.children!.add(PickerItem(value: o['name']));
        }
      }
  }

然后在调用处,编写以下代码

static void TwoPicker(context, {
    required List<dynamic> list,
    required Function onConfirm,
    List<int>? selecteds
  }){

    print(list);
    List<PickerItem> data = [];
    _parseArrayPickerDataItem(list, data);

    Picker picker = Picker(
        adapter: PickerDataAdapter(
          // pickerdata: list,
          isArray: true,

          data: data
        ),

isArray必须设置为true,因为在别处会用到。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题