DropdownButton尝试使用Flutter中另一个类的项目重新创建

时间:2020-08-07 19:41:32

标签: flutter

我在应用程序中放置了几个DropdownButton,如下所示:

enter image description here

用户可以通过以下切换按钮在布局之间进行切换: Pessoal或Equipe

enter image description here

这些dropdownButton都填充有来自API的数据,其代码如下 这个:

FutureBuilder<List<Map<String, dynamic>>>(                                                       
 future: loadColaboradores(),                                                                    
 builder: (BuildContext context, AsyncSnapshot<List<Map<String, dynamic>>> snapshot) {           
   if (!snapshot.hasData)                                                                        
      return CircularProgressIndicator();                                                        
   else                                                                                          
     return Expanded(                                                                            
       child: DropdownButton<String>(                                                            
       isExpanded: true,                                                                         
       value: _responsavelSelecionado,                                                           
       onChanged: (String newValue) {                                                            
         var arr = newValue.split('|');                                                          
         setState(() {                                                                           
           _responsavelSelecionado = newValue;                                                   
         });                                                                                     
       },                                                                                        
       items: snapshot.data.map((Map map) {                                                      
           return new DropdownMenuItem<String>(                                                  
           value: map["nome"].toString().inCaps + "|" + map["fotoUrl"].toString(),               
           child: FittedBox(                                                                     
               child: Row(children: <Widget>[                                                    
             Container(                                                                          
                 width: 35.0,                                                                    
                 height: 35.0,                                                                   
                 decoration: new BoxDecoration(                                                  
                     shape: BoxShape.circle,                                                     
                     image: new DecorationImage(                                                 
                         fit: BoxFit.fill, image: new NetworkImage(map["fotoUrl"])))),           
             SizedBox(                                                                           
               width: 10,                                                                        
             ),                                                                                  
             Text(map["nome"].toString().inCaps,                                                 
                 style:                                                                          
                     TextStyle(color: Colors.black54, fontSize: 14, fontWeight: FontWeight.w500),
                 overflow: TextOverflow.ellipsis)                                                
           ])),                                                                                  
         );                                                                                      
       }).toList(),                                                                              
     ));                                                                                         
 })                                                                                              

它们都有自己的类,并且在单独的方法中调用了API。

如果我来回浏览屏幕,就可以了。

但是,如果我切换布局,则flutter会尝试使用其他填充DropdownMenu 其他类的项目。您会看到一些不属于的物品 到那一类的地方,过了一会儿 正确的。

enter image description here

看看:装备黑洞

黑洞不应该装备齐全,因为正如我们在此处看到的那样,它属于Meta。

但是Responsável更糟,因为它有图片并且在尝试渲染图片时 如果使用了错误的类,它会崩溃并显示像素溢出的消息。

这发生在菜单的第一行,直到Flutter填满所有选项,然后 该应用程序恢复正常。

为了避免这种情况,我在这里尝试了很多事情,但到目前为止没有成功。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我正在猜测问题是否出在您如何填充单个下拉按钮,而不是上面。您是否正在使用有状态的小部件来包装包含下拉按钮的小部件?如果是这样,您是否使用Keys正确处理它们的呈现方式?

如果您使用的是诸如listView(或Column,row等)之类的Widget,然后将其放入有状态的Widgetview中,则使用键很重要。否则,当您重新填充该ListView时,可能会有不想要的行为。

最终,有关按键的更多信息,请观看以下视频:https://www.youtube.com/watch?v=kn0EOS-ZiIc&t=98s