Как устранить эту ошибку? Дочерние элементы RenderFlex имеют ненулевую гибкость, но входящие ограничения по высоте неограниченны

#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. нужно ли мне удалять