Как использовать ListString в groupBy? с помощью flutter

#flutter

#flutter

Вопрос:

Здравствуйте, я пытаюсь отобразить список данных, сгруппированных по дате.

Сначала я загружаю все ключи / значения, сохраненные с помощью sharedpreference, после того, как я использую регулярное выражение для сопоставления для каждой даты ключа данных и значения данных после того, как я использую List для добавления всех дат / данных / значений подобным образом :

  List<String>  MylistString=[{"release_date":"2020-10-30","note3":"2222222"}, {"release_date":"2020-10-29","note3":"1111111"}, {"release_date":"2020-10-31","note3":"3333333"}, {"release_date":"2020-10-29","note4":"bdlbd"}] 
  

Мне не удалось использовать groupBy с MyListString даже после добавления.toString

 var foo = groupBy({MylistString.toString()}, (i) => i["release_date"]); 
  

Но если я создам статическую строку с теми же данными, это сработает

Вот полный код, который отображает список значений ключа для каждой даты, я ищу, чтобы сгруппировать эти данные по дате:

 import 'package:flutter/material.dart';
import 'package:flutter_timeline/flutter_timeline.dart';
import 'package:flutter_timeline/indicator_position.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';


void main() {
  runApp(TimelineDemoApp());
}

class TimelineDemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Timeline',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: PlainTimelineDemoScreen(),
    );
  }
}

class PlainTimelineDemoScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _PlainTimelineDemoScreenState();
}

class _PlainTimelineDemoScreenState extends State<PlainTimelineDemoScreen> {
  List<EventData> eventsData;
  List<TimelineEventDisplay> events;

  String Data1;
  String Data2;

  @override
  void initState() {
    super.initState();
  }


  List<String> stringList_note_formatted = [];

  List<String> stringList_date_note1 =[] ;
  String value_note1;

  List<String> stringList_date_note2 =[] ;
  String value_note2;

  load_data() async {

//---------------------------------------------------------------------------------------------------

    var input = '"2020-10-30","note1":"value1","2020-10-30","note2":"value2","2020-10-31","note1":"value3","2020-10-32","note2":"value4",';



    var inputItarable = input.split(',').where((s) => s.isNotEmpty);
    var i = inputItarable.iterator;
    var tmp = {};
    while (i.moveNext()) {
      var key = i.current; i.moveNext();
      var value = i.current.split(':'); (tmp[key] ??= []).add(value); } print(tmp);
    var output = tmp.keys.map((key) {
      var map = {}; map['"release_date"'] = key; tmp[key].forEach((e) => map[e[0]] = e[1]);
      return map; }).toList();
    print(output);


    if (output == null) {
      //no data available
      eventsData = [];
    } else {
      //deserialize event data from json
      var items = jsonDecode(output) as List;
      eventsData = items.map((i) => EventData.fromJson(i)).toList();
    }
    //render event data
    events = eventsData.map(plainEventDisplay).toList();
  }
  final myController2 = TextEditingController();
  final myController3 = TextEditingController();


  String note2;

  dialog_text() async{

    await showDialog<String>(
        barrierDismissible: false, // user must tap button!

        context: context,
        builder: (BuildContext context){
          return AlertDialog(
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(20.0))),
            title:    Text(("Write something"),textAlign: TextAlign.center, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w600, fontSize: 20)),
            content:

            Container(
              width: MediaQuery.of(context).size.width*1,

              child:
              new ListView(
                children: <Widget>[
                  Card(
                      color: Colors.grey[200],
                      child: Padding(
                        padding: EdgeInsets.all(8.0),
                        child: TextField(
                          controller: myController2,
                          maxLines:2,
                          decoration: InputDecoration.collapsed(hintText: "Your text"),
                        ),
                      )

                  ),
                ],
              ),
            ),



            actions: <Widget>[


              FlatButton(
                onPressed: () {
                  Navigator.pop(context,);
                },
                child:  Text('Validate', textAlign:TextAlign.center,style: TextStyle(
                    fontWeight: FontWeight.bold,
                    fontSize:15),
                ),
              ),
            ],
          );
        }
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Timeline test"),
      ),
      body: FutureBuilder(
        future: load_data(),
        builder: (context, snapshot) {
          return _buildTimeline();
        },
      ),

    );
  }

  TimelineEventDisplay plainEventDisplay(EventData eventData) {
    var formattedTime = DateFormat('dd-MM-yyyy').format(eventData.dateTime);

    Widget text1() {
      if (eventData.data1==null){
        return       Container();
      }else{
        return       Text("note1 : ${eventData.data1}");
      }
    }

    Widget text2() {
      if (eventData.data2==null){
        return       Container();
      }else{
        return       Text("note2 : ${eventData.data2}");
      }
    }
    return TimelineEventDisplay(

      anchor: IndicatorPosition.top,
      indicatorOffset: Offset(0, 0),
      child: TimelineEventCard(
          title: Text("${formattedTime}"),
          content: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              new Row(
                children: [
                  new Expanded(
                      child : new Card(
                        elevation: 3,
                        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
                        child:  new Container(
                          padding: const EdgeInsets.all (10.0),
                          child: Column(
                            children: [
                              text1(),
                              Padding(
                                padding: EdgeInsets.all(5.0),),
                              text2(),
                            ],
                          ),
                        ),
                      )
                  )
                ],
              )
            ],
          )),
      indicator: TimelineDots.of(context).circleIcon,
    );
  }

  Widget _buildTimeline() {
    return TimelineTheme(
        data: TimelineThemeData(
            lineColor: Colors.blueAccent, itemGap: 5, lineGap: 0),
        child: Timeline(
          anchor: IndicatorPosition.center,
          indicatorSize: 56,
          altOffset: Offset(10, 10),
          events: events,
        ));
  }

}

class EventData {
  final DateTime dateTime;
  final String data1;
  final String data2;

  EventData(this.dateTime, this.data1, this.data2);

  EventData.fromJson(Map<String, dynamic> json)
      : dateTime = DateTime.parse(json['release_date']),
        data1 = json['note1'],
        data2 = json['note2'];

  Map<String, dynamic> toJson() => {
    'release_date': dateTime.toIso8601String(),
    'note1': data1,
    'note2': data2,
  };
}
  

Комментарии:

1. MylistString это не List<String> так — это List<Map<String>> — когда вы говорите List<String> , это означает, что каждый элемент в списке String , в то время как в вашем случае это {} то, что является Map дротиком

2. извините, я не понимаю ^^ Я не знаком с map / list / Json T_T

3. У меня есть только list<String> и я пытаюсь сгруппировать по дате, чтобы быть совместимым с моей моделью json

4. нет, у вас есть список карт

5. var input = "2020-10-30,note1:value1,2020-10-30,note2:value2,2020-10-31,note1:value3,2020-10-32,note2:value4,"; var inputItarable = input.split(',').where((s) => s.isNotEmpty); var i = inputItarable.iterator; var tmp = {}; while (i.moveNext()) { var key = i.current; i.moveNext(); var value = i.current.split(':'); (tmp[key] ??= []).add(value); } print(tmp); var output = tmp.keys.map((key) { var map = {}; map['release_date'] = key; tmp[key].forEach((e) => map[e[0]] = e[1]); return map; }).toList(); print(output);