#flutter #dart #listview #crud
Вопрос:
Я хочу извлечь данные, сохраненные в базе данных на главной странице. Я использовал listview.builder в Futurebuilder. Но я получаю следующую ошибку на экране.
= = = = = = = = Исключение, обнаруженное библиотекой рендеринга ===================================================== Следующее утверждение было выдано во время performLayout(): RenderBox не был выложен: RenderConstrainedBox#2acf2 relayoutBoundary=up15 ПОТРЕБНОСТИ-ПОТРЕБНОСТИ В КРАСКЕ-КОМПОЗИТИНГ-БИТЫ-ОБНОВЛЕНИЕ «пакет:flutter/src/рендеринг/box.dart»: Неудачное утверждение: строка 1929 поз 12: «hasSize»
код здесь :
class MainPage extends StatelessWidget {
String _firstLanguage = "English";
String _secondLanguage = "Turkish";
WordController controller = Get.put(WordController());
final _formKey = GlobalKey<FormState>();
late List<Word?> wordList;
@override
Widget build(BuildContext context) {
controller.getir();
return Scaffold(
drawer: _drawer,
backgroundColor: Colors.blueAccent,
appBar: _appbar,
body: _bodyScaffold,
floatingActionButton: _floattingActionButton,
);
}
SingleChildScrollView get _bodyScaffold {
return SingleChildScrollView(
child: Column(
children: [
chooseLanguage,
translateTextView,
SizedBox(height: 5,),
futureBuilder,
],
),
);
}
FutureBuilder<dynamic> get futureBuilder {
return FutureBuilder(
future: controller.getir(),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
wordList = snapshot.data;
return Container(
height: Get.height/3,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: wordList.length,
itemBuilder: (context, index) {
Word? _word = wordList[index];
return ItemCard(
word: _word,
input1: controller.controllerInput1,
input2: controller.controllerInput2,
);
},
),
);
}
return Center(
child: CircularProgressIndicator(),
);
});
}
AppBar get _appbar {
return AppBar(
backgroundColor: Colors.blueAccent,
centerTitle: true,
title: Text("TRANSLATE"),
elevation: 0.0,
);
}
refreshList() {
controller.getir();
}
get chooseLanguage => Container(
height: 55.0,
decoration: buildBoxDecoration,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
firstChooseLanguage,
changeLanguageButton,
secondChooseLanguage,
],
),
);
get buildBoxDecoration {
return BoxDecoration(
color: Colors.white,
border: Border(
bottom: BorderSide(
width: 3.5,
color: Colors.grey,
),
),
);
}
get changeLanguageButton {
return Material(
color: Colors.white,
child: IconButton(
icon: Icon(
Icons.wifi_protected_setup_rounded,
color: Colors.indigo,
size: 30.0,
),
onPressed: () {},
),
);
}
get secondChooseLanguage {
return Expanded(
child: Material(
color: Colors.white,
child: InkWell(
onTap: () {},
child: Center(
child: Text(
this._secondLanguage,
style: TextStyle(
color: Colors.blue[600],
fontSize: 22.0,
),
),
),
),
),
);
}
get firstChooseLanguage {
return Expanded(
child: Material(
color: Colors.white,
child: InkWell(
onTap: () {},
child: Center(
child: Text(
this._firstLanguage,
style: TextStyle(
color: Colors.blue[600],
fontSize: 22.0,
),
),
),
),
),
);
}
get translateTextView => Column(
children: [
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
margin: EdgeInsets.only(left: 2.0, right: 2.0, top: 4.0),
child: _form,
),
Container(
height: 300,
child: ListView.builder(
itemCount: controller.items.length,
itemBuilder: (BuildContext context, int index) {
return historyListCard(index);
},
),
)
],
);
get _form {
return Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.white30,
height: 120.0,
padding: EdgeInsets.only(left: 16.0, top: 8.0, bottom: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
textFormFieldEntr,
favoriIconButton,
],
),
),
textFormField,
],
),
);
}
get textFormFieldEntr {
return Flexible(
child: Container(
child: TextFormField(
onChanged: (text)async{
await controller.translateLanguage(text);
},
// controller: controller.controllerInput1,
maxLines: 6,
// validator: (controllerInput1) {
// if (controllerInput1!.isEmpty) {
// return "lütfen bir değer giriniz";
// } else if (controllerInput1.length > 22) {
// return "en fazla 22 karakter girebilirsiniz";
// }
// return null;
// },
decoration: InputDecoration(
hintText: "Enter",
contentPadding: const EdgeInsets.symmetric(vertical: 5.0),
),
),
),
);
}
get textFormField {
return Container(
color: Colors.white30,
height: 120.0,
padding: EdgeInsets.only(left: 16.0, right: 42.0, top: 8.0, bottom: 8.0),
child: Container(
child: TextFormField(
controller: controller.controllerInput2,
maxLines: 6,
validator: (controllerInput2) {
if (controllerInput2!.length > 22) {
return "en fazla 22 karakter girebilirsiniz";
}
return null;
},
decoration: InputDecoration(
contentPadding: const EdgeInsets.symmetric(vertical: 5.0),
),
),
),
);
}
Card historyListCard(int index) {
return Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
),
margin: EdgeInsets.only(left: 8.0, right: 8.0, top: 0.8),
child: Container(
color: Colors.white30,
height: 70.0,
padding: EdgeInsets.only(left: 8.0, top: 8.0, bottom: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
firstText(index),
secondText(index),
],
),
),
],
),
),
);
}
Text firstText(int index) {
return Text(
controller.items.value[index].wordEn ?? "",
style: TextStyle(
fontWeight: FontWeight.w600,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
);
}
Text secondText(int index) {
return Text(
controller.items.value[index].wordTr ?? "",
style: TextStyle(
fontWeight: FontWeight.w400,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
);
}
get favoriIconButton {
return IconButton(
alignment: Alignment.topRight,
onPressed: () async {
bool validatorKontrol = _formKey.currentState!.validate();
if (validatorKontrol) {
String val1 = controller.controllerInput1.text;
String val2 = controller.controllerInput2.text;
print("$val1 $val2");
await controller.addNote();
}
await Obx(() => textFormField(
controller: controller.controllerInput2,
));
await Obx(() => textFormField(
controller: controller.controllerInput1,
));
},
icon: Icon(
Icons.forward,
color: Colors.blueGrey,
size: 36.0,
),
);
}
FloatingActionButton get _floattingActionButton {
return FloatingActionButton(
onPressed: () {
Get.to(WordListPage());
},
child: Icon(
Icons.app_registration,
size: 30,
),
);
}
Drawer get _drawer {
return Drawer(
child: ListView(
// Important: Remove any padding from the ListView.
padding: EdgeInsets.zero,
children: <Widget>[
UserAccountsDrawerHeader(
accountName: Text("UserName"),
accountEmail: Text("E-mail"),
currentAccountPicture: CircleAvatar(
backgroundColor: Colors.grey,
child: Text(
"",
style: TextStyle(fontSize: 40.0),
),
),
),
ListTile(
leading: Icon(Icons.star_border_outlined),
title: Text("Favorilerim"),
onTap: () {
Get.back();
},
),
ListTile(
leading: Icon(Icons.settings),
title: Text("Settings"),
onTap: () {
Get.back();
},
),
ListTile(
leading: Icon(Icons.contacts),
title: Text("Contact Us"),
onTap: () {
Get.back();
},
),
],
),
);
}
}
класс виджетов:
class ItemCard extends StatefulWidget {
Word? word;
TextEditingController? input1;
TextEditingController? input2;
Function()? onDeletePress;
Function()? onEditPress;
ItemCard(
{this.word,
this.input1,
this.input2,
this.onDeletePress,
this.onEditPress});
@override
_ItemCardState createState() => _ItemCardState();
}
class _ItemCardState extends State<ItemCard> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
flex: 1,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
(Text(
'İngilizce: ${widget.word!.wordEn}',
style: TextStyle(fontSize: 15),
maxLines: 1,
overflow: TextOverflow.ellipsis,
)),
Text(
'Türkçe: ${widget.word!.wordTr}',
style: TextStyle(
fontSize: 15,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
Row(
children: [
CircleAvatar(
backgroundColor: Colors.white,
child: IconButton(
onPressed: widget.onEditPress,
icon: Icon(
Icons.edit,
color: Colors.blueAccent,
),
),
),
SizedBox(
width: 15,
),
CircleAvatar(
backgroundColor: Colors.white,
child: IconButton(
onPressed: widget.onDeletePress,
icon: Icon(
Icons.delete,
color: Colors.red,
),
),
),
CircleAvatar(
backgroundColor: Colors.white,
child: IconButton(
onPressed: () {},
icon: Icon(
Icons.favorite_border,
color: Colors.red,
),
),
),
],
),
],
),
),
),
);
}
}
Комментарии:
1. где находится файл box.dart?
2. Это файл, принадлежащий Флаттеру paste.ubuntu.com/p/bvXmv8SVzQ
3. вместо Get.height / 3 используйте фиксированную высоту и посмотрите, работает ли она?
4. не работает до сих пор
Ответ №1:
Эта ошибка-боль для любого. 😉 Эмпирическое правило заключается SingleChildScrollView
в том, что may правильно работает в ограниченном контейнере. В вашем случае вы применили прокрутку на расширенном (не ограниченном) пространстве.
Комментарии:
1. нужно ли мне удалять