首页 > 解决方案 > DropdownButton 尝试使用 Flutter 中另一个类的项目重新创建

问题描述

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

在此处输入图像描述

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

在此处输入图像描述

这些 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 在单独的方法中调用。

如果我来回导航到屏幕,它可以正常工作。

但是,如果我切换布局,颤动会尝试用其他类的项目填充其他 DropdownMenu。你可以看到几个不属于该类的项目在一段时间后将填充正确的项目。

在此处输入图像描述

看:装备黑洞

Black Hole 不应该处于equipe,因为它属于 Meta,正如我们在那里看到的那样。

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

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

我在这里尝试了很多东西,但直到现在都没有成功来避免这种情况。任何帮助将不胜感激。

标签: flutter

解决方案


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

如果您正在使用像 listView(或 Column、row 等)这样的 Widget,然后您在该 listview 中放入有状态的小部件,那么使用键很重要。否则,当您重新填充该 ListView 时,您可能会遇到不需要的行为。

最后,有关键的更多信息,有这个视频:https ://www.youtube.com/watch?v=kn0EOS-ZiIc&t=98s


推荐阅读