Как добавить список в конец ящика в флаттере - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать приложение, в котором я хочу отображать некоторые даты, используя сетевой вызов, который я сделал. Теперь я хочу показать этот список в моем endDrawer. Заранее спасибо.

Вот мой код:

    Future<List> addDateList(int counter,String date) async {
    DateTime oops = DateTime.now();
    String date = DateFormat('dd/MM/yyyy').format(oops);
    List<String> dateList = List();

    http.Response response = await http.get(
        'https://www.example.com/json/' + date + '-17.json');

    if (response.statusCode == 200) {
      dateList.add(date);
    } else {
      date = getpreviousdate(date);
      return addDateList(counter,date);
    }
    if (dateList.length == 7) {
      print(dateList);

      return dateList;
    } else {
      date = getpreviousdate(date);
      return addDateList(++counter, (date));
    }
  }

  getpreviousdate(String date) {
    DateTime pastday = DateTime.now().subtract(Duration(days: 1));
    date = DateFormat('dd/MM/yyyy').format(pastday);

    return date;
  }

1 Ответ

0 голосов
/ 06 февраля 2020

Итак, если вы просто хотите создать ListView из собранных строк даты, вы можете сделать это следующим образом:

@immutable
class DrawerView extends StatelessWidget {
  const DrawerView({
    @required this.items,
  }) : assert(items != null);

  final List<String> items;

  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        // Important: Remove any padding from the ListView.
        padding: EdgeInsets.zero,
        children: items.map<Widget>((String item) => ListTile(title: Text(item))),
      ),
    );
  }
}

Я предпочитаю создать новый класс для таких вещей, как это.


РЕДАКТИРОВАТЬ

ОК, вы можете попробовать это (я не запускал, потому что у меня нет такого API для тестирования, но он должен работать очень хорошо ):

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:http/http.dart' as http;

void main() => runApp(MyApp());

/// [MyApp] class - where it all begins! :D
class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  int _counter = 0;
  List<String> _dateList = <String>[];

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

  Future addDateList({ DateTime date }) async {
    final DateTime d = date ?? DateTime.now();
    String dateString = DateFormat('dd/MM/yyyy').format(d);

    http.Response response = await http.get('https://www.example.com/json/$dateString-17.json');

    if (response.statusCode == 200) {
      setState(() {
        _dateList.add(dateString);
        _counter++;
      });
    }

    // if you reach the desired length or the counter gets too high break the execution
    if (_dateList.length >= 7 || _counter > 50) return true;

    setState(() {
      _counter++;
    });

    return addDateList(date: d.subtract(Duration(days: 1)));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Drawer Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('HOME'),
        ),
        endDrawer: MyDrawer(items: _dateList),
        body: Center(
          child: const Text('DRAWER WITH LISTVIEW - DEMO'),
        ),
      ),
    );
  }
}

class MyDrawer extends StatelessWidget {
  const MyDrawer({
    @required this.items,
  }) : assert(items != null);

  final List<String> items;

  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        // Important: Remove any padding from the ListView.
        padding: EdgeInsets.zero,
        children: items.map<Widget>((String item) => ListTile(title: Text(item))).toList(),
      ),
    );
  }
}
...