#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 . Примеры по ссылке. Очень прост в использовании