Виджет не возвращает представление о будущем состоянии в flutter

#android #dart #flutter

#Android #dart #flutter

Вопрос:

Виджет не возвращает представление. isAttrAssignedToProduct в этом методе я пытаюсь найти присвоенный атрибут в таблице, если продукт существует в таблице, затем возвращает true, и изображение будет увеличено в элементе listview на основе true или false. Моя база данных возвращает true или false при условии, но представление не отображается.

 Widget isAttrAssigned(int index){
Future result = isAttrAssignedToProduct(index);
return FutureBuilder(
    future: result,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      result.then((v){
        debugPrint('FUTURE VALE ${v}');
        attr(v);
      });
},);
 Widget attr(bool v){
    return v==true?Container(
      width: 20.0,
      height: 20.0,
      decoration: BoxDecoration(
          color: Colors.yellow),
      child: Image.asset('assets/images/right.png'),
    ):Text('df');
  }
  

Мой запрос работает нормально

  Future<bool> isAttrAssignedToProduct(int index) async {
    List<Map<String, dynamic>> assd=new List<Map<String, dynamic>>();
    try{
      assd= await dbHelper.queryReadGroupAssignedAttribute(productList[index][DatabaseHelper.columnpid]);
      if(assd.length>0){
       // debugPrint('ASSIGNED ATTR PRESENT ${assd.length}');
        return true;
      }else{
        return false;
      }
    }catch(e){
      //debugPrint('ASSIGNED ATTR EXCEPTION ${e}');
      return false;
    }
  }
  

Моя плитка списка

 ListTile(
          contentPadding: EdgeInsets.only(left: height*0.03,right: height*0.03 ),
          onTap: (){
            Navigator.push(context,
              MaterialPageRoute(builder: (context) => ProductDetails(pid: productList[index]["pid"],),
                  settings: RouteSettings(name: '/productdetail')),).then((value){
                    setState(() {
                      length=value;
                    });
                    debugPrint('CEHCK BACK FROM DAETAIL $length');
            });
          },
          title: Text(
              '${title}',
              style: TextStyle(fontFamily: 'semibold',color: MyColors.colorPrimaryDark,fontSize: 18.0)),
          subtitle: Text(
              'Price $${price}',
              style: TextStyle(color: Colors.grey,fontSize: 14.0,fontFamily: 'semibold')),
          trailing:isAttrAssigned( index), //here i'm trying to inflate image
        ),
  

Ответ №1:

ваша функция Widget isAttrAssigned ничего не возвращает.

Если вы хотите создать виджет на основе Future, вы можете использовать FutureBuilder https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

 Widget isAttrAssigned(int index) {
   // maybe you want to cache your result here, to avoid doing a call at each rebuild
   Future result = isAttrAssignedToProduct(index);

   return FutureBuilder(
      future: result
      builder: (BuildContext context, AsyncSnapshot snapshot) {
     // return widget
   });

}
  

снимок.данные — это ваше логическое значение

 switch (snapshot.connectionState) { 
case ConnectionState.none: 
return Container(); // empty or show a placeholder 
case ConnectionState.active: 
case ConnectionState.waiting: 
return Text('Loading ...'); 
case ConnectionState.done: 
if (snapshot.hasError) { 
return Text('Error: ${snapshot.error}'); 
} 
return attr(snapshot.data); 
}
  

Комментарии:

1. как я могу isAttrAssignedToProduct оценить внутри builder .

2. Я возвращаю представление внутри конструктора, но оно показывает null.

3. извините, не понял ваш первый вопрос и что показывает null?

4. Внутри builder возвращает представление, когда результат истинный, но отображается build function must never return null .

5. конечно, пожалуйста, проверьте.

Ответ №2:

Вы должны использовать FutureBuilder . Примеры по ссылке. Очень прост в использовании