【问题标题】:Is there a way to convert Future<List<String>> to List<dynamic>?有没有办法将 Future<List<String>> 转换为 List<dynamic>?
【发布时间】:2019-01-21 20:45:12
【问题描述】:

编辑:

主页 - 我正在从我的 firebase 集合中获取字符串列表。然后我想调用firestore存储并获取可下载的图像链接并将其存储在我将传递到第2页的列表中。下面的代码是我获取可下载链接的方式。

Future<List<String>> test(List images) async{
  List<String> listOfImages = List<String>();
  for(int i = 0; i < images.length; i++){
     final ref = FirebaseStorage.instance.ref().child(images[i]);
     var url = await ref.getDownloadURL();
     listOfImages.add(url);
  }
  return listOfImages;
}

然后我以以下方式传递图像列表

Navigator.push(
  context,
  MaterialPageRoute(
     builder: (context) => CarDetailScreen(
        carImages: test( car['images'])
  )),
);

第 2 页 - 我收到了一个 Future>,我想将其转换为列表

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;
}

new CarouselSlider(
  items: ***["This is where I need a List"]***.map((url) {
    return new Container(
        margin: new EdgeInsets.all(5.0),
        child: 
        new GestureDetector(
          onTap: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => ViewCarImages(
                                  carImages: _getImages(snapshot))),
                        );
                      },
          child:
        new ClipRRect(
            borderRadius: new BorderRadius.all(new Radius.circular(5.0)),
            child: 
            new Image.network(
              url,
              fit: BoxFit.cover,
              width: 1000.0,
            )
            )
            )
            );
  }).toList(),
  viewportFraction: 0.9,
  aspectRatio: 2.0,
  autoPlay: false,
)

【问题讨论】:

  • 为什么需要动态而不是字符串?
  • 因为我正在使用插件(CarouselSlider)并且在 items 属性中它正在寻找 List
  • 没有办法从Future 到同步的非未来。您对该值所做的任何事情都必须是异步的。 FutureBuilder 是 Fl​​utter 的典型方式 - 如果这不可能,您需要提供更多上下文。
  • @NateBosch 我在我的问题中添加了更多代码。我尝试添加一个 FutureBuilder,但我真的不确定如何实现这一点。

标签: dart flutter


【解决方案1】:

您可以只返回一个 Widget 列表,如下所示:

    Future<List<Widget>> test(List images) async{   
       List<Widget> listOfImages = List<Widget>();
       for(int i = 0; i < images.length; i++){ 
          final ref = FirebaseStorage.instance.ref().child(images[i]); 
          var url = await ref.getDownloadURL(); 
          listOfImages.add(Image.network(url));
       }
      return listOfImages; 
    }

【讨论】:

  • 问题在于调用此方法。这是一个 Future>,而我需要一个 List。我不知道该如何表达,但问题在于未来。
  • 如果您的小部件需要列表字符串而不是未来,请使用 futurebuilder 并将您的小部件放入其中。为您的问题添加更多代码
  • 如果您不介意再看一遍,我已经添加了更多代码。
【解决方案2】:

以下代码将解决您的问题。在下面编写的 carouselSlide 类(检查项目变量)中,您需要按照以下过程在 carousel 中处理 Future 对象

@override
  Widget build(BuildContext context) {
    return Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          backgroundColor: Colors.white,
          title: Text("some text",
              style: TextStyle(
                  fontWeight: FontWeight.normal,
                  color: Colors.black,
                  fontSize: 16.0)),
          centerTitle: false,
          actions: <Widget>[
            IconButton(
              tooltip: 'Search something',
              icon: Icon(
                Icons.search,
                color: SharedColor().sapphireDarkBlue,
              ),
              onPressed: () async {
                var selected = await showSearch<int>(
                    context: context, delegate: _delegate);
                if (selected != null && selected != _lastIntegerSelected) {
                  setState(() {
                   //pass the data from searchfield query to here
                  });
                }
              },
            ),
          ],
          automaticallyImplyLeading: false,
        ),
        body: _carouselBuild(),

    );
  }

  FutureBuilder<caraouselImage> _carouselBuild() {
    return FutureBuilder<caraouselImage>(
        future: ImageRestApiManager().caraouselImage(myEmail),
        builder: (context, AsyncSnapshot<caraouselImage> snapshot) {
          if (snapshot.hasData) {

            return CarouselSlider(
                items: snapshot.data.collection.map((i) {
                  return Builder(builder: (BuildContext context) {
                    return Container(
                      margin: EdgeInsets.all(5.0),
                      child: ClipRRect(
                        borderRadius: BorderRadius.all(Radius.circular(5.0)),
                        child: Stack(children: <Widget>[
                          Image.network(i.imageurl,
                              fit: BoxFit.cover, width: 1000.0),
                          Positioned(
                            bottom: 0.0,
                            left: 0.0,
                            right: 0.0,
                            child: Container(
                              decoration: BoxDecoration(
                                gradient: LinearGradient(
                                  colors: [
                                    Color.fromARGB(200, 0, 0, 0),
                                    Color.fromARGB(0, 0, 0, 0)
                                  ],
                                  begin: Alignment.bottomCenter,
                                  end: Alignment.topCenter,
                                ),
                              ),
                              padding: EdgeInsets.symmetric(
                                  vertical: 10.0, horizontal: 20.0),
                              child: Text(
                                _currentCookieSelected.toString(),
                                style: TextStyle(
                                  color: Colors.white,
                                  fontSize: 20.0,
                                  fontWeight: FontWeight.bold,
                                ),
                              ),
                            ),
                          ),
                        ]),
                      ),
                    );
                  });
                }).toList(),
                autoPlay: false,
                enlargeCenterPage: true,
                viewportFraction: 0.9,
                aspectRatio: 2.0,
                onPageChanged: (index) {
                  setState(() {
                    _currentImageSelected = snapshot.data.collection[index].id;
                  });
                });
          } else {
            return CircularProgressIndicator();
          }
        });
  }
}





I solved using below youtube tutorial

https://www.youtube.com/watch?v=xBLtPDHvT44

【讨论】:

    【解决方案3】:

    FutureBuilder 应该会为您提供所需的内容。在这里,我将您的 CarouselSlider 包裹在 FutureBuilder 中,并将 future 属性设置为您的 carImages Future。当您的字符串列表准备就绪时,FutureBuilder 将通过其 builder 方法创建 CarouselSlider,然后所有列表项都将出现:

        return FutureBuilder<List<String>>(
          future: carImages,
          initialData: [],
          builder: (context, snapshot) {
            return new CarouselSlider(
              viewportFraction: 0.9,
              aspectRatio: 2.0,
              autoPlay: false,
              items: snapshot.data.map((url) {
                return new Container(
                  margin: new EdgeInsets.all(5.0),
                  child: 
                  new GestureDetector(
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => ViewCarImages(
                          carImages: _getImages(snapshot))),
                      );
                    },
                    child: new ClipRRect(
                      borderRadius: new BorderRadius.all(new Radius.circular(5.0)),
                      child: new Image.network(
                        url,
                        fit: BoxFit.cover,
                        width: 1000.0,
                      )
                    )
                  )
                );
              }).toList(),
            );
          }
        );
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      相关资源
      最近更新 更多