Будущий строитель Постоянно обновляет - PullRequest
0 голосов
/ 26 января 2020

Я использую будущего построителя, чтобы получить данные из снимка и отфильтровать эти данные в другую функцию Future, которая создает маркеры. Я получаю результаты от фильтрации местоположений для всех ресторанов, но функция постоянно обновляется, а данные просто мерцают.

Редактировать 2: JSON Данные

    { restaurant:[  {
            "id": 4,
            "restaurant_name": "Good Chemistry",
            "phone": "1231231234",
            "street_address": "2 Penn Plaza",
            "restaurant_logo": "https://restaurants.s3.amazonaws.com/restaurant_logo/GOODCHEM-3-web_99314.jpg",
            "restaurant_photo": "https://restaurants.s3.amazonaws.com/restaurant_photo/GOODCHEM-3-web_99314.jpg",
            "city": "NY",
            "state": "New York",
            "zip_Code": 10010,
            "lat": 40.8931283,
            "lng": -73.8205375,
            "latlng": "(40.7770112244898, -74.2110798163265)",
            "opening_hours": [
                {
                    "day_of_week": "Tuesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Wednesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Thursday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Friday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Saturday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Sunday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": 7,
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                }
            ],
            "ratings": 4.1
        },
        {
            "id": 3,
            "restaurant_name": "The Farmacy",
            "phone": "1231231234",
            "street_address": "11 Penn Plaza",
            "restaurant_logo": "https://restaurants.s3.amazonaws.com/restaurant_logo/farma.jpg",
            "restaurant_photo": "https://restaurants.s3.amazonaws.com/restaurant_photo/farma.jpg",
            "city": "NY",
            "state": "New York",
            "zip_Code": 10010,
            "lat": 40.8931283,
            "lng": -73.8205375,
            "latlng": "(40.7770112244898, -74.2110798163265)",
            "opening_hours": [
                {
                    "day_of_week": "Tuesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Wednesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Thursday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Friday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Saturday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Sunday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": 7,
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                }
            ],
            "ratings": 4.7
        },
        {
            "id": 2,
            "restaurant_name": "Hoboken Smokin",
            "phone": "123-123-1234",
            "street_address": "11 Penn Plaza",
            "restaurant_logo": "https://restaurants.s3.amazonaws.com/restaurant_logo/urban-restaurant-web-1024x640.jpg",
            "restaurant_photo": "https://restaurants.s3.amazonaws.com/restaurant_photo/urban-restaurant-web-1024x640.jpg",
            "city": "NY",
            "state": "New York",
            "zip_Code": 10010,
            "lat": 40.8931283,
            "lng": -73.8205375,
            "latlng": "(40.7770112244898, -74.2110798163265)",
            "opening_hours": [
                {
                    "day_of_week": "Tuesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Wednesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Thursday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Friday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Saturday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Sunday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": 7,
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                }
            ],
            "ratings": 3.5
        },
        {
            "id": 1,
            "restaurant_name": "The Bakeree",
            "phone": "1231231234",
            "street_address": "433 5th Ave",
            "restaurant_logo": "https://restaurants.s3.amazonaws.com/restaurant_logo/restaurantimage.jpeg",
            "restaurant_photo": "https://restaurants.s3.amazonaws.com/restaurant_photo/restaurantimage.jpeg",
            "city": "NY",
            "state": "New York",
            "zip_Code": 10016,
            "lat": 40.7512061,
            "lng": -73.9822721,
            "latlng": "(40.7770112244898, -74.2110798163265)",
            "opening_hours": [
                {
                    "day_of_week": "Tuesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Wednesday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Thursday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Friday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Saturday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": "Sunday",
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                },
                {
                    "day_of_week": 7,
                    "opening_time": "08:00:00",
                    "closing_time": "22:00:00"
                }
            ],
            "ratings": 4.6
        }
    ]
}

РЕДАКТ. 1: _setRestaurant function

Future getRestaurants() async {
  var url = 'http://yellows-1929.herokuapp.com/api/customer/restaurant/';

  var response = await http.get(url);
  var responseData = json.decode(response.body);

  Restaurants _restaurant = Restaurants.fromJSON(responseData);

  return _restaurant.restaurant;
}




Filter Location function

<!-- begin snippet: js hide: false console: true babel: false -->

Будущий построитель, который получает данные и вызывает функцию filterMarker:

Widget _buildRestaurants() {
    return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              FutureBuilder(
                  future: _setRestaurants,
                  builder: (context, AsyncSnapshot snapshot) {
                    var restaurants = snapshot.data;
                    recRestaurants = snapshot.data;

                    if (snapshot.data == null) {
                      return Center(child: CircularProgressIndicator());
                    } else {
                          filterMarker(restaurants, 20);

                      return Column(
                        children: <Widget>[
                          _makeRestaurants(restaurants),
                          _buildCoupon(),
                          _buildVendors(filteredVenues)
                        ],
                      );
                    }
                  })
            ]));
  }

Фильтр просто постоянно обновляется и печатает

flutter: the lat is 41.722068434324785 and the long is -74.34910777767849
flutter: There are 1 _filteredMarkers
flutter: There are 0 _filteredMarkers
flutter: There are 0 _filteredMarkers
flutter: There are 1 _filteredMarkers
flutter: There are 1 _filteredMarkers
flutter: There are 1 _filteredMarkers
flutter: There are 0 _filteredMarkers
flutter: There are 0 _filteredMarkers
flutter: There are 1 _filteredMarkers

1 Ответ

1 голос
/ 27 января 2020

Немного трудно сказать, что происходит без полного фрагмента кода - было бы гораздо полезнее, если бы вы создали небольшой рабочий образец, который показал, что происходит.

Однако я считаю, что есть Несколько вещей, которые могут помочь.

  1. Прекратить создание виджетов с функциями, где это возможно. Если он достаточно сложен, чтобы создать функцию, вам, скорее всего, стоит создать его в собственном виджете. Это позволяет флаттеру оптимизировать создание различных виджетов, а также очистку вашего кода.

  2. Неясно, что такое _setRestaurants, но вы ссылаетесь на него в FutureBuilder. Сразу после этого это будет означать, что _setRestaurants будет Future, и он будет изменен только , когда будет выполнен новый запрос к серверу . Обработайте объект _setRestaurants как часть состояния виджета и предположите, что при его изменении виджет будет перестроен. Так что это будет выглядеть примерно так:

Future<Restaurants> _setRestaurants;

void initState() {
  super.initState();

  _setRestaurants = _getRestaurants();
}

void updateRestaurants() {
  setState(() {
    _setRestaurants = _getRestaurants();
  });
}

Обратите внимание, что я на самом деле не рекомендую делать это именно так, это просто для демонстрации того, что может делать ОП неправильно .

Вы, вероятно, не должны фильтровать данные на стороне клиента. Подумайте о масштабе - если у вас есть 50 ресторанов, это вполне приемлемо, но если у вас их тысячи, вы не сможете каждый раз запрашивать их все. Вместо этого вам следует добавить параметры в запрос на получение и выполнить фильтрацию на сервере.

Имеет смысл выделить часть «извлечение информации с сервера и фильтрацию» из этого » отображение ресторанов на экране «часть этого. Таким образом, у вас будет разделение интересов, вы можете протестировать серверную часть и часть пользовательского интерфейса независимо друг от друга, и это будет более надежным. Есть много разных способов go об этом, поэтому я не буду углубляться в go, поскольку это выходит за рамки этого вопроса, но посмотрите на MVVM или посмотрите некоторые ссылки на Страница управления состоянием флаттера . Вы также можете использовать StreamBuilder и stream вместо futurebuilder, так как это позволит отображать обновленные результаты при каждом изменении данных (т. Е. При изменении фильтра).

...