CupertinoActionSheet выбрасывает бесконечный размер во время ошибки макета - PullRequest
0 голосов
/ 02 мая 2020

Я получаю следующую ошибку при вызове CupertinoActionSheet при реализации SingleChildScrollView в моем виджете с состоянием:

_RenderCupertinoAlertActions объекту был задан бесконечный размер во время макета. Отношение ошибок вызывая виджеты CupertinoActionSheet Lib \ main.dart: 82 следующий RenderObject обрабатывался, когда исключение было уволено: _RenderCupertinoAlertActions # 56898 relayoutBoundary = up19 ПОТРЕБНОСТЕЙ-шаблон необходимо-PAINT потребности Compositing-битных-UPDATE RenderObject: _RenderCupertinoAlertActions # 56898 relayoutBoundary = up19 НЕОБХОДИМОСТИ-ПЛАНИРОВАТЬ ПОТРЕБНОСТИ-PAINT НЕОБХОДИМОСТИ-COMPOSITING-BITS-UPDATE ограничения: Размер BoxConstraints (w = 395,4, 0,0 <= h <= Infinity): размер (395,4, Infinity), дочерний 1: RenderPointerListener # 7df6e relayoutBound NEEDS-PAINT parentData: offset = Offset (0.0, 0.0); id = null (можно использовать размер) ограничения: BoxConstraints (w = 395,4, 0,0 <= h <= Infinity) size: Size (395.4, Infinity) поведение: непрозрачные слушатели: down </p>

полный код прилагается (отредактировано на основе комментария ниже для устранения ошибки бесконечного размера):

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  List<String> leaveTypes = ["Vacation Leave","Ordinary Sick Leave","Childcare Leave"];
  String applyLeaveType;

  @override
  Widget build(BuildContext context) {
    if(applyLeaveType == null){
      applyLeaveType = leaveTypes[0];
    };
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: LayoutBuilder(builder:(context, constraints){
        return SingleChildScrollView(
          /*child: ConstrainedBox(
            constraints: BoxConstraints(
              minWidth: constraints.maxWidth, minHeight: constraints.maxHeight
            ),*/
            child: Container(
              height: constraints.maxHeight,
              color: Color.fromARGB(255, 244, 246, 249),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  //Text for leave type
                  Container(                            
                    alignment: Alignment(-1.0,0.0),
                    padding:EdgeInsets.only(
                      top: 10, bottom: 5, left: 20, right: 20
                    ),
                    child: Text("I want to apply for",
                      style: TextStyle(fontSize: 16),
                      textAlign: TextAlign.left,
                    )
                  ),
                  SizedBox(
                    width: MediaQuery.of(context).size.width,
                    height:80,
                    child: GestureDetector(
                      onTap:() {
                        buildLeaveList(){
                          List<Widget> widgets = List();
                          leaveTypes.forEach((leaveType){
                            print(leaveType);
                            widgets.add(
                              CupertinoActionSheetAction(
                                child: Text(leaveType),
                                onPressed: () {
                                  setState(() {
                                    applyLeaveType = leaveType;
                                  });
                                  Navigator.pop(context);
                                }
                              )
                            );

                          });
                          return widgets;
                        }
                        final action = Container(
                          height: MediaQuery.of(context).size.height,
                          child: CupertinoActionSheet(

                            title: Text(
                              "Leave Type",
                              style: TextStyle(fontSize:16)
                            ),
                            actions: buildLeaveList(),
                            cancelButton: CupertinoActionSheetAction(
                              child: Text("Back"),
                              onPressed:(){
                                Navigator.pop(context);
                              }
                            )
                          )
                        );
                        showCupertinoModalPopup(context: context, builder: (context) => action);
                      },
                      child: Container(
                        alignment: Alignment(0.0,0.0),
                        padding:EdgeInsets.only(
                          top: 10, bottom: 10, left: 20, right: 20
                        ),
                        decoration: BoxDecoration(
                          color: Colors.white,
                          //border: Border.all(),
                          //borderRadius: BorderRadius.all(Radius.circular(10))
                        ),                     
                        child:Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            Container(
                              padding: EdgeInsets.all(10),
                              child: Text(applyLeaveType),
                            ),
                            Container(
                              padding: EdgeInsets.all(10),
                              child: Icon(Icons.keyboard_arrow_down)
                            )
                          ],
                        )
                      )
                    ),
                  )
                ]
              )
            )
          //)
        );  
      })  
    );
  }
}

1 Ответ

0 голосов
/ 02 мая 2020

Проблема заключается в том, что если вы используете какой-либо список, то для него требуется указание c высоты их родительского виджета, в котором может создаваться просмотр списка.

Если вы используете ListView с ShrinkWrap: true и некоторым другим виджетом, который он будет создавать но высота нижнего листа становится высотой всего экрана.

Окончательное решение: мы можем создать переменную в отдельном методе, добавить в нее все элементы и, наконец, вызвать этот метод в действии.

Следующая подсказка кода Вы должны понять.

создать следующий метод:

 callme() {
    List<Widget> mywidget = List();
    leaveTypes.forEach((e) => mywidget.add(CupertinoActionSheetAction(
        child: Text(e),
        onPressed: () {
          setState(() {
            applyLeaveType = e;
          });
          Navigator.pop(context);
        })));
    return mywidget;
  }

Вызовите этот метод в действии следующим образом.

actions: callme()

Обновление:

Рабочая демоверсия:

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> leaveTypes = [
    "Vacation Leave",
    "Ordinary Sick Leave",
    "Childcare Leave"
  ];
  String applyLeaveType;
  callme() {
    List<Widget> mywidget = List();
    leaveTypes.forEach((e) => mywidget.add(CupertinoActionSheetAction(
        child: Text(e),
        onPressed: () {
          setState(() {
            applyLeaveType = e;
          });
          Navigator.pop(context);
        })));
    return mywidget;
  }

  @override
  Widget build(BuildContext context) {
    if (applyLeaveType == null) {
      applyLeaveType = leaveTypes[0];
    }

    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: LayoutBuilder(builder: (context, constraints) {
          return SingleChildScrollView(
              child: Container(
                  height: constraints.maxHeight,
                  color: Color.fromARGB(255, 244, 246, 249),
                  child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Container(
                            alignment: Alignment(-1.0, 0.0),
                            padding: EdgeInsets.only(
                                top: 10, bottom: 5, left: 20, right: 20),
                            child: Text(
                              "I want to apply for",
                              style: TextStyle(fontSize: 16),
                              textAlign: TextAlign.left,
                            )),
                        SizedBox(
                          width: MediaQuery.of(context).size.width,
                          height: 80,
                          child: GestureDetector(
                              onTap: () {
                                final action = Container(
                                    child: CupertinoActionSheet(
                                        title: Text("Leave Type",
                                            style: TextStyle(fontSize: 16)),
                                        actions: callme(),
                                        cancelButton:
                                            CupertinoActionSheetAction(
                                                child: Text("Back"),
                                                onPressed: () {
                                                  Navigator.pop(context);
                                                })));
                                showCupertinoModalPopup(
                                    context: context,
                                    builder: (context) => action);
                              },
                              child: Container(
                                  alignment: Alignment(0.0, 0.0),
                                  padding: EdgeInsets.only(
                                      top: 10, bottom: 10, left: 20, right: 20),
                                  decoration: BoxDecoration(
                                    color: Colors.white,
                                  ),
                                  child: Row(
                                    mainAxisAlignment:
                                        MainAxisAlignment.spaceBetween,
                                    children: <Widget>[
                                      Container(
                                        padding: EdgeInsets.all(10),
                                        child: Text(applyLeaveType),
                                      ),
                                      Container(
                                          padding: EdgeInsets.all(10),
                                          child:
                                              Icon(Icons.keyboard_arrow_down))
                                    ],
                                  ))),
                        )
                      ])));
        }));
  }
}
...