* Не обновляет sh карусель Slider в флаттере - PullRequest
0 голосов
/ 27 марта 2020

Я пытался создать приложение для отображения изображений, для этого я использую Firestore, Flutter ... для слайдера Я использую плагин carousel_slider для отображения этих изображений, но когда я получил новый изображение из Firestore, ползунок не отображает новое изображение, но круг (индикатор) отображает новый круг, но не работает, индикатор работает только с исходными изображениями.

enter image description here

мой код карусель:

_loadCarrouselFood(){
    var carouselSlider = CarouselSlider(
      viewportFraction: 1.0,
      aspectRatio: 2.0,
      autoPlay: false,
      enlargeCenterPage: true,
      items: child,
      onPageChanged: (index) {
        setState(() {
          _current = index;
        });
        LatLng locationDish = LatLng(_locationDish[_current].latitude, _locationDish[_current].longitude);
          moveCameraTo(locationDish);
      },
    );

    setState(() {
      _sliderDish = carouselSlider;
    });

    return carouselSlider;
  }
}

Функция Firestore:

_getInfoDish() async{

    List<LocationDish> _locationDishTmp = <LocationDish>[];
    List<Dish> _dishCardTmp = <Dish>[];
    bool hasFoodInArray = false;

    Firestore.instance // Get the firebase instance
      .collection(Constants.NAME_COLECTION) // Get the informations collection
      .snapshots() // Get the Stream of DocumentSnapshot
      .listen((QuerySnapshot snapshot){

        _locationDishTmp.clear();
        _dishCardTmp.clear();

        print(":::::: - FIRESTORE - ::::::");  

        snapshot.documents.forEach((obj){

        //Set dish to Cards
        _dishCardTmp.add(
          Dish(
            id: obj.data["id"],
            name: obj.data["name"],
            photoURL: 'https://recetaparahoy.com/wp-content/uploads/2017/06/ceviche-peruano-630x420.jpg',
            score: obj.data["score"].toDouble(),
          ),
        );

        });

        if(_locationDishTmp.length > 0)
        {
          setState(() {
            //add only food recent data
            for(int i = 0; i < _locationDishTmp.length; i++){
              _locationDish.add(_locationDishTmp[i]);
              _dishCard.add(_dishCardTmp[i]);
            }

            //_current = _locationDish.length-1;
            _hasFoodOnMap = true;            
          });
        }
      }); 
  }

Пожалуйста, кто-то может сказать мне ошибку, или, может быть, любой другой решение, чтобы сделать это, я надеюсь, что мое объяснение ясно, спасибо большое !!!

1 Ответ

1 голос
/ 27 марта 2020

Вы можете скопировать и вставить полный код ниже
Я использую следующую демонстрацию для имитации этого случая
Вы можете использовать CarouselSlider.builder элемент сборки, когда он будет виден
https://github.com/serenader2014/flutter_carousel_slider#build -элемент -виджеты по требованию

рабочая демонстрация

enter image description here

полный код

import 'package:flutter/material.dart';
import 'package:carousel_slider/carousel_slider.dart';

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

class MyApp extends StatelessWidget {  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(        
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 1;
  String url = 'https://picsum.photos/250?image=';
  List<String> urlList = ['https://picsum.photos/250?image=1'];
  int _current = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
      urlList.add('https://picsum.photos/250?image=${_counter}');
    });
  }

  List<T> map<T>(List list, Function handler) {
    List<T> result = [];
    for (var i = 0; i < list.length; i++) {
      result.add(handler(i, list[i]));
    }

    return result;
  }

  @override
  Widget build(BuildContext context) {    
    return Scaffold(
      appBar: AppBar(        
        title: Text(widget.title),
      ),
      body: Center(        
        child: Column(         
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CarouselSlider.builder(
              autoPlay: false,
              enlargeCenterPage: true,
              aspectRatio: 2.0,
              onPageChanged: (index) {
                setState(() {
                  _current = index;
                });
              },
              itemCount: urlList.length,
              itemBuilder: (BuildContext context, int index) =>
                  Container(
                    child: Image.network(urlList[index]),
                  ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: map<Widget>(
                urlList,
                    (index, url) {
                  return Container(
                    width: 8.0,
                    height: 8.0,
                    margin: EdgeInsets.symmetric(vertical: 10.0, horizontal: 2.0),
                    decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: _current == index
                            ? Color.fromRGBO(0, 0, 0, 0.9)
                            : Color.fromRGBO(0, 0, 0, 0.4)),
                  );
                },
              ),
            ),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...