2017-10-19 46 views
0

Je me bats cette DropDownItem erreur de boîte, tout semble fonctionner, mais fait apparaître le jaune hors des limites pendant le chargement. J'ai essayé plusieurs choses et je n'arrive pas à le résoudre. J'ai ce code pour mon Widget. Je l'utilise ensuite comme l'une des fonctions suivantes.Flutter RenderIndexedStack objet a été donné une taille infinie pendant la mise en page

Widget _referrerPractice() { 
assert(!_createNew); 
return new Form(
    key: _formKey2, 
    child: new Expanded(
    child: new ListView(
     padding: const EdgeInsets.symmetric(horizontal: 16.0), 
     children: <Widget>[ 
     new InputDecorator(
      decoration: const InputDecoration(
      labelText: 'Referrer Practice', 
      hintText: 'Choose Referrer Practice or choose new', 
     ), 
      isEmpty: _referPractice == null, 
      child: new DropdownButton<String>(
      value: _referPractice, 
      isDense: true, 
      onChanged: (String newValue) { 
       setState(() { 
       _referPractice = newValue; 
       }); 
      }, 
      items: practicelist.map((Map value) { 
       return new DropdownMenuItem<String>(
       value: value['id'].toString(), 
       child: new Text(value['name']), 
      ); 
      }).toList(), 
     ), 
     ), 
     new RaisedButton(
      child: new Text('Start'), onPressed: _startReferrer), 
     ], 
    ), 
), 
); 

}

Il semble fonctionner sur une autre page et je ne pas utiliser une fonction pour remplir le widget, juste un var régulier de widgets, mais il semble qu'il devrait être la même que la structure est la même.

Des idées que je manque? Ceci est un DropDownButton, mais il arrive sur la page qui a un DropDownButton ainsi pour l'autre fonction.

EDIT ********** Ceci est le code de travail

final List<String> _allTypeAppt = <String>['Elective OP', 'Hospital Transfer', 'Phone Consult']; 

new Form(
     key: _formKey, 
     autovalidate: _autovalidate, 
     onWillPop: _warnUserAboutInvalidData, 
     child: new Expanded(
      child: new ListView(
      padding: const EdgeInsets.symmetric(horizontal: 16.0), 
      children: <Widget>[ 
       new TextFormField(
       decoration: const InputDecoration(
        icon: const Icon(Icons.person), 
        hintText: 'First Name?', 
        labelText: 'First Name *', 
       ), 
       controller: _fnameController, 

       onSaved: (String value) { referral.fname = value; }, 
       validator: _validateName, 
      ), 

       new TextFormField(
       decoration: const InputDecoration(
        icon: const Icon(Icons.person), 
        hintText: 'Last Name?', 
        labelText: 'Last Name *', 
       ), 
       controller: _lnameController, 
       onSaved: (String value) { referral.lname = value; }, 
       validator: _validateName, 
      ), 

       new _DateTimePicker(
       labelText: 'DOB', 
       selectedDate: _fromDate, 
       selectDate: (DateTime date) { 
        setState(() { 
        _fromDate = date; 
        }); 
       }, 
      ), 

       new TextFormField(
       decoration: const InputDecoration(
        icon: const Icon(Icons.phone), 
        hintText: 'How to contact?', 
        labelText: 'Phone Number *', 
       ), 
       controller: _phoneController, 
       keyboardType: TextInputType.phone, 
       onSaved: (String value) { referral.contact = value; }, 
       validator: _validatePhoneNumber, 
       // TextInputFormatters are applied in sequence. 
       /*inputFormatters: <TextInputFormatter> [ 
        WhitelistingTextInputFormatter.digitsOnly, 
        // Fit the validating format. 
        _phoneNumberFormatter, 
       ],*/ 
      ), 

       new TextFormField(
       decoration: const InputDecoration(
        icon: const Icon(Icons.phone), 
        hintText: 'Alt contact?', 
        labelText: 'Alt Phone Number *', 
       ), 
       controller: _altPhoneController, 
       keyboardType: TextInputType.phone, 
       onSaved: (String value) { referral.altcontact = value; }, 
       validator: _validatePhoneNumber, 
       // TextInputFormatters are applied in sequence. 
       /*inputFormatters: <TextInputFormatter> [ 
        WhitelistingTextInputFormatter.digitsOnly, 
        // Fit the validating format. 
        _phoneNumberFormatter, 
       ],*/ 
      ), 

       new TextFormField(
       decoration: const InputDecoration(
        icon: const Icon(Icons.email), 
        hintText: 'Patien Email?', 
        labelText: 'Patient Email *', 
       ), 
       controller: _emailController, 
       onSaved: (String value) { referral.altcontact = value; }, 
       //validator: _validatePhoneNumber, 
       // TextInputFormatters are applied in sequence. 
       /*inputFormatters: <TextInputFormatter> [ 
        WhitelistingTextInputFormatter.digitsOnly, 
        // Fit the validating format. 
        _phoneNumberFormatter, 
       ],*/ 
      ), 

       new TextFormField(
       decoration: const InputDecoration(
        hintText: 'Tell us about patient', 
        helperText: 'It does not have to be detailed yet', 
        labelText: 'Referral Details', 
       ), 
       controller: _detailsController, 
       maxLines: 5, 
      ), 

       new InputDecorator(
       decoration: const InputDecoration(
        labelText: 'Type of Appointment', 
        hintText: 'Choose an Appointment Type', 
       ), 
       isEmpty: _typeAppt == null, 
       child: new DropdownButton<String>(
        value: _typeAppt, 
        isDense: true, 
        onChanged: (String newValue) { 
        setState(() { 
         _typeAppt = newValue; 
        }); 
        }, 
        items: _allTypeAppt.map((String value) { 
        return new DropdownMenuItem<String>(
         value: value, 
         child: new Text(value), 
        ); 
        }).toList(), 
       ), 
      ), 

       new RaisedButton(
       child: new Text('Submit Referral'), 
       onPressed: _submitData, 
      ), 

      ], 

     ) 
    ) 
), 
+0

Je ne comprends pas vraiment votre question, pouvez-vous le rendre plus clair? Quelle est l'erreur à laquelle vous faites face? où exactement y faites-vous face? s'il vous plaît essayez d'expliquer le problème d'une manière claire? quel est le problème ? – aziza

+0

Pouvez-vous montrer le code qui fonctionne sur une autre page? – aziza

Répondre

0

j'ai pu reproduire votre problème, je ne sais pas pourquoi vous construisez la mise en page de cette façon. Vous alimentez votre DropDownButton en tant que propriété child pour InputDecorator, ce qui est correct. Cependant, il lance cette erreur car DropDownMenuItem déborde de votre InputDecorator. En d'autres termes, vous ne contenez pas seulement le DopDownButton dans votre InputDecorator, mais aussi vos items essayent d'être contenus dans le même espace. Donc, Flutter est confus sur la façon de positionner la liste de items à l'intérieur de l'espace fourni par le InputDecorator.

Je suis vraiment confus quel genre de mise en page que vous essayez de construire, pourquoi avez-vous besoin d'un Form et un ? Peut-être fournir un peu de contexte à vos choix de conception afin que nous puissions mieux aider.

J'ai créé une mise en page plus simple avec les widgets et TextField, cela peut être utile.

enter image description here

class MyApp extends StatefulWidget { 
    @override 
    _MyAppState createState() => new _MyAppState(); 
} 

class _MyAppState extends State<MyApp> { 
    String _mySelection; 
    String _text = "Choose"; 
    List<Map> _myJson = [ 
    {"id": "ID 1310012", "name": "Newcommer"}, {"id": "ID 0000TEMP", "name": "Temp"}]; 

    Widget _children() { 
    TextEditingController _controller = new TextEditingController(text: _text); 
    return new Expanded(child: new ListView(
      padding: const EdgeInsets.symmetric(horizontal: 16.0), 
      children: <Widget>[ 
       new Container (
     child: new Row(
        children: <Widget>[ 
        new Expanded(
         child: new TextField(
         controller: _controller, 
        ), 
        ), 
        new DropdownButton(
         isDense: true, 
         value: _mySelection, 
         items: _myJson.map((Map map) { 
         return new DropdownMenuItem<String>(
          value: map["id"], 
          child: new Text(
          map["name"], 
         ), 
         ); 
         }).toList(), 
         onChanged: (String newValue) { 
         setState(() { 
          _mySelection = newValue; 
          _text = newValue; 
         }); 
         }) 
       ],),), 
       new RaisedButton(
        child: new Text('Start'), onPressed: null), 

      ] 
     )); 
    } 

    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(title: new Text("Test")), 
     body: new Column(
     mainAxisSize: MainAxisSize.max, 
     children: <Widget>[ 
      _children(), 
     ], 
    ), 
    ); 
    } 
} 
+0

J'ai donc pris un exemple à partir d'exemples de flutter pour dropdownbutton, j'utilise le décorateur d'entrée car il permet d'utiliser l'icône ainsi que le texte et l'étiquette de l'indice. La seule différence entre le code de travail et le non-travail est que dans le code non-travail, je peuple _children en utilisant une fonction de widget avec un assert pour passer d'une forme à l'autre et le travail a une liste statique au lieu de dynamiquement liste créée d'éléments. Donc c'est bizarre pourquoi ça jette l'erreur. Toutes les autres pensées pour le faire fonctionner avec le décorateur d'entrée seraient super pour que je puisse avoir l'icône, etc ... – Robert

+0

Pouvez-vous me montrer le code statique qui fonctionne? aussi je ne pense toujours pas que vous avez besoin d'un InputDecorator du tout – aziza

+0

Etes-vous sûr que vous n'obtenez pas d'erreurs de débogage sur la console lorsque vous ouvrez le menu déroulant sur la vue statique que vous venez d'ajouter? Je veux dire le travail DropDown je comprends, mais que voyez-vous sur votre console? – aziza