textfield_tags icon indicating copy to clipboard operation
textfield_tags copied to clipboard

textSeparators issue

Open BalaVenkatasainath opened this issue 2 years ago • 21 comments

LateInitializationError: Field '_textSeparators@1298091221' has already been initialized.

I tried in many ways but still I could not solve it can you please help me regarding it.

BalaVenkatasainath avatar Jun 23 '22 13:06 BalaVenkatasainath

LateInitializationError: Field '_textSeparators' has already been initialized.

When the user goes back to the previous screen and comes back it shows like this. I tried it on flutter web,

Basil-Baby-94 avatar Jun 24 '22 07:06 Basil-Baby-94

LateInitializationError: Field '_textSeparators' has already been initialized.

When the user goes back to the previous screen and comes back it shows like this. I tried it on flutter web,

I tried it on mobile an same happened

BalaVenkatasainath avatar Jun 24 '22 11:06 BalaVenkatasainath

@eyoeldefare could you please check?

Basil-Baby-94 avatar Jun 25 '22 09:06 Basil-Baby-94

Can you provide an example of your code so I can see why you're getting this issue? Also what version of this package are you on, and what version of flutter?

eyoeldefare avatar Jun 28 '22 00:06 eyoeldefare

Can you provide an example of your code so I can see why you're getting this issue? Also what version of this package are you on, and what version of flutter?

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

void main() { runApp(const MyApp()); }

class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key);

@override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(

    // is not restarted.
    primarySwatch: Colors.blue,
  ),
  home: const MyHomePage(title: 'Flutter Demo Home Page'),
);

} }

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

final String title;

@override State<MyHomePage> createState() => _MyHomePageState(); }

class _MyHomePageState extends State<MyHomePage> { TextfieldTagsController _tagsController = TextfieldTagsController();

OutlineInputBorder buildBorder(Color color) { return OutlineInputBorder( borderSide: BorderSide(color: color, width: 1.0), borderRadius: BorderRadius.all(Radius.circular(3.0))); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body:Column( children: [ TextFieldTags( textfieldTagsController: _tagsController, initialTags: const ["isvf","vbsbvdfj","unvfjnv"], textSeparators: const [' ', ','], letterCase: LetterCase.normal, validator: (String tag) { if (tag == 'php') { return 'No, please just no'; } else if (_tagsController.getTags! .contains(tag)) { return 'you already entered that'; } return null; }, inputfieldBuilder: (context, tec, fn, error, onChanged, onSubmitted) { return ((context, sc, tags, onTagDelete) { return TextField( controller: tec, focusNode: fn, decoration: InputDecoration( isDense: true, border: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), helperStyle: const TextStyle( color: Colors.black, ), hintText: _tagsController.hasTags ? '' : "Enter tag...", prefixIconConstraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width * 0.74), prefixIcon: tags.isNotEmpty ? SingleChildScrollView( controller: sc, scrollDirection: Axis.horizontal, child: Row( children: tags.map((String tag) { return Container( decoration: const BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(20.0), ), color: Color.fromARGB( 255, 74, 137, 92), ), margin: const EdgeInsets .symmetric( horizontal: 5.0), padding: const EdgeInsets .symmetric( horizontal: 10.0, vertical: 5.0), child: Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ InkWell( child: Text( tag, style: const TextStyle( color: Colors .white), ), onTap: () { //print("$tag selected"); }, ), const SizedBox( width: 4.0), InkWell( child: const Icon( Icons.cancel, size: 14.0, color: Color.fromARGB( 255, 233, 233, 233), ), onTap: () { onTagDelete(tag); }, ) ], ), ); }).toList()), ) : null, ), onChanged: onChanged, onSubmitted: onSubmitted, ); }); }, ), TextButton(onPressed: (){ _tagsController.getTags; print(_tagsController.getTags); _tagsController.clearTags(); }, child:const Text("rferge")) ], ), ); } }

BalaVenkatasainath avatar Jun 28 '22 04:06 BalaVenkatasainath

Can you provide an example of your code so I can see why you're getting this issue? Also what version of this package are you on, and what version of flutter?

I'm using fluter 3.0.3 and textfield_tags 2.0.1

BalaVenkatasainath avatar Jun 28 '22 04:06 BalaVenkatasainath

Its working for me with your example. I am not sure why you're getting this.

Also remove "!" from else if (_tagsController!.getTags.contains(tag)) { return 'you already entered that'; }

eyoeldefare avatar Jun 28 '22 17:06 eyoeldefare

Its working for me with your example. I am not sure why you're getting this.

Also remove "!" from else if (_tagsController!.getTags.contains(tag)) { return 'you already entered that'; }

List<String>? get getTags if I remove "!" it I'm getting error tags issue

BalaVenkatasainath avatar Jun 29 '22 06:06 BalaVenkatasainath

import 'dart:io'; import 'package:bottle_crm/bloc/contact_bloc.dart'; import 'package:bottle_crm/bloc/lead_bloc.dart'; import 'package:bottle_crm/bloc/team_bloc.dart'; import 'package:bottle_crm/bloc/user_bloc.dart'; import 'package:dropdown_search/dropdown_search.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:flutter/material.dart'; import 'package:bottle_crm/bloc/account_bloc.dart'; import 'package:bottle_crm/utils/utils.dart'; import 'package:flutter/services.dart'; import 'package:flutter_quill/flutter_quill.dart' as quill; import 'package:file_picker/file_picker.dart'; import 'package:flutter_swipe_detector/flutter_swipe_detector.dart'; import 'package:multiselect_formfield/multiselect_formfield.dart'; import 'package:textfield_tags/textfield_tags.dart';

class CreateAccount extends StatefulWidget { CreateAccount(); @override State createState() => _CreateAccountState(); }

class _CreateAccountState extends State<CreateAccount> { int _currentTabIndex = 0; quill.QuillController _controller = quill.QuillController.basic(); GlobalKey<FormState> _accountFormKey = GlobalKey<FormState>(); GlobalKey<FormState> _addressFormKey = GlobalKey<FormState>(); TextEditingController fileNameController = new TextEditingController(); TextfieldTagsController _tagsController = TextfieldTagsController();

List _accountFormKeys = [ "name", "phone", "email", "contacts", "website", "lead", "assigned_to", "status", "account_attachment", "tags" ]; List _addressFormKeys = [ "billing_address_line", "billing_street", "billing_city", "billing_state", "billing_postcode", "billing_country" ]; Map _errors = {}; bool _isLoading = false; File? file = File('');

@override void initState() { super.initState(); }

@override void dispose() { super.dispose(); }

OutlineInputBorder boxBorder() { return OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(5.0)), borderSide: BorderSide(width: 1, color: Colors.black45), ); }

OutlineInputBorder buildBorder(Color color) { return OutlineInputBorder( borderSide: BorderSide(color: color, width: 1.0), borderRadius: BorderRadius.all(Radius.circular(3.0))); }

EdgeInsets padding() { return EdgeInsets.symmetric( horizontal: screenWidth / 30, vertical: screenHeight / 80); }

_filePicker() async { FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: false); if (result != null) { file = File(result.files[0].path!); var _filename = file!.path.toString(); var split = _filename.split('/'); Map<int, String> values = { for (int i = 0; i < split.length; i++) i: split[i] }; setState(() { fileNameController.text = values[7].toString(); }); } else {} }

buildTopBar() { if (_currentTabIndex == 0) { return SwipeDetector( onSwipeLeft: (offset) { setState(() { if (_accountFormKey.currentState != null) _accountFormKey.currentState!.save(); _currentTabIndex = 1; }); }, child: buildaccountBlock()); } else if (_currentTabIndex == 1) { return SwipeDetector( onSwipeLeft: (offset) { setState(() { if (_addressFormKey.currentState != null) _addressFormKey.currentState!.save(); _currentTabIndex = 2; }); }, onSwipeRight: (offset) { setState(() { if (_addressFormKey.currentState != null) _addressFormKey.currentState!.save(); _currentTabIndex = 0; }); }, child: buildAddressBlock()); } else if (_currentTabIndex == 2) { return SwipeDetector( onSwipeRight: (offset) { setState(() { _currentTabIndex = 1; }); }, child: buildDescriptionBlock()); } }

Widget buildaccountBlock() { return Container( child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Form( key: _accountFormKey, child: Container( child: Column(children: [ Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, verticalDirection: VerticalDirection.down, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Name ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['name'], cursorWidth: 3.0, decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.text, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['name'] = value; }, ), ), _errors['name'] != null ? Container( margin: EdgeInsets.only(top: 5.0), alignment: Alignment.centerLeft, child: Text( _errors['name'][0], style: TextStyle( color: Colors.red[700], fontSize: 12.0), ), ) : Container(), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Website ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['website'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), hintText: 'https://www.bottlecrm.com', enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.url, onSaved: (value) { accountBloc.currentEditAccount['website'] = value; }), ), _errors['website'] != null ? Container( margin: EdgeInsets.only(top: 5.0), alignment: Alignment.centerLeft, child: Text( _errors['website'][0], style: TextStyle( color: Colors.red[700], fontSize: 12.0), ), ) : Container(), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Phone Number ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['phone'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), hintText: '+91XXXXXXXXXX', ), keyboardType: TextInputType.phone, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['phone'] = value; }, ), ), _errors['phone'] != null ? Container( margin: EdgeInsets.only(top: 5.0), alignment: Alignment.centerLeft, child: Text( errors['phone'][0], style: TextStyle( color: Colors.red[700], fontSize: 12.0), ), ) : Container(), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Email Address ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['email'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.emailAddress, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } if (value.isNotEmpty && !RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^`{|}~]+@[a-zA-Z0-9]+.[a-zA-Z]+") .hasMatch(value)) { return 'Enter valid email address.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['email'] = value; }, ), ), _errors['email'] != null ? Container( margin: EdgeInsets.only(top: 5.0), alignment: Alignment.centerLeft, child: Text( _errors['email'][0], style: TextStyle( color: Colors.red[700], fontSize: 12.0), ), ) : Container(), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Leads ", style: buildLableTextStyle(), ), SizedBox(height: screenHeight / 70), Container( height: 48.0, margin: EdgeInsets.only(bottom: 5.0), child: DropdownSearch<String?>( items: leadBloc.leadsTitles, onChanged: print, onSaved: (selection) { if (selection == null) { accountBloc.currentEditAccount['lead'] = ""; } else { accountBloc.currentEditAccount['lead'] = selection; } }, selectedItem: accountBloc.currentEditAccount['lead'], popupProps: PopupProps.bottomSheet( itemBuilder: (context, item, isSelected) { return Container( padding: EdgeInsets.symmetric( horizontal: 15.0, vertical: 10.0), child: Text(item!, style: TextStyle( fontSize: screenWidth / 22)), ); }, constraints: BoxConstraints(maxHeight: 400), searchFieldProps: TextFieldProps( decoration: InputDecoration( border: boxBorder(), enabledBorder: boxBorder(), focusedErrorBorder: boxBorder(), focusedBorder: boxBorder(), errorBorder: boxBorder(), contentPadding: EdgeInsets.all(12), hintText: "Search a Lead", )), showSearchBox: true, showSelectedItems: false, ), ), ) ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: Text( "Teams", style: TextStyle( fontSize: 18, color: Colors.black54), ), ), SizedBox(height: screenHeight / 70), Container( child: MultiSelectFormField( border: boxBorder(), fillColor: Colors.white, dataSource: teamBloc.teamsObjForDropdown, textField: 'name', valueField: 'id', okButtonLabel: 'OK', chipLabelStyle: TextStyle(color: Colors.black), cancelButtonLabel: 'CANCEL', hintWidget: Text( "Please choose one or more", style: TextStyle(color: Colors.grey), ), title: Text( "teams", ), initialValue: accountBloc.currentEditAccount['teams'], // validator: (value) { // if (value.length == 0) { // return 'Please select one or more options'; // } // return null; // }, onSaved: (value) { if (value == null) return; accountBloc.currentEditAccount['teams'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Contacts ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( child: MultiSelectFormField( border: boxBorder(), fillColor: Colors.white, dataSource: contactBloc.contactsObjForDropdown, textField: 'name', valueField: 'id', okButtonLabel: 'OK', chipLabelStyle: TextStyle(color: Colors.black), cancelButtonLabel: 'CANCEL', hintWidget: Text( "Please choose one or more", style: TextStyle(color: Colors.grey), ), title: Text( "Contacts", ), initialValue: accountBloc.currentEditAccount['contacts'], onSaved: (value) { if (value == null) return; accountBloc.currentEditAccount['contacts'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Assigned To", style: buildLableTextStyle(), ), SizedBox(height: screenHeight / 70), Container( child: MultiSelectFormField( border: boxBorder(), fillColor: Colors.white, dataSource: userBloc.usersObjForDropdown, textField: 'name', valueField: 'id', okButtonLabel: 'OK', chipLabelStyle: TextStyle(color: Colors.black), cancelButtonLabel: 'CANCEL', hintWidget: Text( "Please choose one or more", style: TextStyle(color: Colors.grey), ), title: Text( "users", ), initialValue: accountBloc .currentEditAccount['assigned_to'], onSaved: (value) { if (value == null) return; accountBloc .currentEditAccount['assigned_to'] = value; }), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Status", style: buildLableTextStyle(), ), SizedBox(height: screenHeight / 70), Container( margin: EdgeInsets.only(bottom: 5.0), child: DropdownButtonFormField( decoration: InputDecoration( border: boxBorder(), contentPadding: EdgeInsets.all(12.0)), style: TextStyle(color: Colors.black), hint: Text('select Status'), value: accountBloc.currentEditAccount['status'], onChanged: (value) { accountBloc.currentEditAccount['status'] = value; }, items: ['open', 'close'].map((item) { return DropdownMenuItem( child: new Text(item), value: item, ); }).toList(), ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Attachment", style: buildLableTextStyle(), ), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( controller: fileNameController, readOnly: true, decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 5.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), suffixIcon: IconButton( onPressed: _filePicker, icon: Icon(Icons.upload))), ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Tags", style: buildLableTextStyle(), ), SizedBox(height: screenHeight / 70), TextFieldTags( textfieldTagsController: _tagsController, initialTags: accountBloc.tags, letterCase: LetterCase.normal, textSeparators: [], validator: (String tag) { if (tag == 'php') { return 'No, please just no'; } else if (_tagsController.getTags! .contains(tag)) { return 'you already entered that'; } return null; }, inputfieldBuilder: (context, tec, fn, error, onChanged, onSubmitted) { return ((context, sc, tags, onTagDelete) { return TextField( controller: tec, focusNode: fn, decoration: InputDecoration( isDense: true, border: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), helperStyle: const TextStyle( color: Colors.black, ), hintText: _tagsController.hasTags ? '' : "Enter tag...", prefixIconConstraints: BoxConstraints( maxWidth: screenWidth * 0.74), prefixIcon: tags.isNotEmpty ? SingleChildScrollView( controller: sc, scrollDirection: Axis.horizontal, child: Row( children: tags.map((String tag) { return Container( decoration: const BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(20.0), ), color: Color.fromARGB( 255, 74, 137, 92), ), margin: const EdgeInsets .symmetric( horizontal: 5.0), padding: const EdgeInsets .symmetric( horizontal: 10.0, vertical: 5.0), child: Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ InkWell( child: Text( tag, style: const TextStyle( color: Colors .white), ), onTap: () { //print("$tag selected"); }, ), const SizedBox( width: 4.0), InkWell( child: const Icon( Icons.cancel, size: 14.0, color: Color.fromARGB( 255, 233, 233, 233), ), onTap: () { onTagDelete(tag); }, ) ], ), ); }).toList()), ) : null, ), onChanged: onChanged, onSubmitted: onSubmitted, ); }); }, ), ])), ]))))); }

Widget buildAddressBlock() { return SingleChildScrollView( scrollDirection: Axis.vertical, child: Form( key: _addressFormKey, child: Container( child: Column(children: [ Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Billing Address Line ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc .currentEditAccount['billing_address_line'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.text, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount[ 'billing_address_line'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Street ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc .currentEditAccount['billing_street'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.text, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['billing_street'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Postal Code ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc .currentEditAccount['billing_postcode'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.number, inputFormatters: <TextInputFormatter>[ FilteringTextInputFormatter.digitsOnly ], validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc .currentEditAccount['billing_postcode'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'City ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['billing_city'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.text, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['billing_city'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'State ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( width: screenWidth * 0.92, child: TextFormField( initialValue: accountBloc.currentEditAccount['billing_state'], decoration: new InputDecoration( contentPadding: new EdgeInsets.symmetric( vertical: 15.0, horizontal: 10.0), enabledBorder: buildBorder(Colors.black54), focusedErrorBorder: buildBorder(Colors.black54), focusedBorder: buildBorder(Colors.black54), errorBorder: buildBorder(Colors.black54), border: buildBorder(Colors.black54), ), keyboardType: TextInputType.text, validator: (value) { if (value!.isEmpty) { return 'This field is required.'; } return null; }, onSaved: (value) { accountBloc.currentEditAccount['billing_state'] = value; }, ), ), ])), Container( padding: padding(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'Country ', style: buildLableTextStyle(), children: <TextSpan>[ TextSpan( text: '* ', style: TextStyle( color: Colors.red, fontSize: screenWidth / 25, fontWeight: FontWeight.w500)) ], ), )), SizedBox(height: screenHeight / 70), Container( height: 48.0, margin: EdgeInsets.only(bottom: 5.0), child: DropdownSearch<String?>( items: leadBloc.countries, onChanged: print, onSaved: (selection) { if (selection == null) { accountBloc .currentEditAccount['billing_country'] = ""; } else { accountBloc .currentEditAccount['billing_country'] = selection; } }, selectedItem: accountBloc .currentEditAccount['billing_country'], popupProps: PopupProps.bottomSheet( itemBuilder: (context, item, isSelected) { return Container( padding: EdgeInsets.symmetric( horizontal: 15.0, vertical: 10.0), child: Text(item!, style: TextStyle( fontSize: screenWidth / 22)), ); }, constraints: BoxConstraints(maxHeight: 400), searchFieldProps: TextFieldProps( decoration: InputDecoration( border: boxBorder(), enabledBorder: boxBorder(), focusedErrorBorder: boxBorder(), focusedBorder: boxBorder(), errorBorder: boxBorder(), contentPadding: EdgeInsets.all(12), hintText: "Search a Country", )), showSearchBox: true, showSelectedItems: false, ), ), ) // Container( // width: screenWidth * 0.92, // child: DropdownSearch<String?>( // mode: Mode.BOTTOM_SHEET, // items: leadBloc.countries, // onChanged: print, // selectedItem: accountBloc // .currentEditAccount['billing_country'], // showSearchBox: true, // showSelectedItems: false, // showClearButton: false, // searchFieldProps: TextFieldProps( // decoration: InputDecoration( // border: boxBorder(), // enabledBorder: boxBorder(), // focusedErrorBorder: boxBorder(), // focusedBorder: boxBorder(), // errorBorder: boxBorder(), // contentPadding: EdgeInsets.all(12), // hintText: "Search a Country", // )), // popupTitle: Container( // decoration: BoxDecoration( // color: Theme.of(context).primaryColorDark, // borderRadius: BorderRadius.only( // topLeft: Radius.circular(20), // topRight: Radius.circular(20), // ), // ), // child: Center( // child: Text( // 'County', // style: TextStyle( // fontSize: screenWidth / 20, // color: Colors.white), // ), // ), // ), // popupItemBuilder: (context, item, isSelected) { // return Container( // padding: EdgeInsets.symmetric( // horizontal: 15.0, vertical: 10.0), // child: Text(item!, // style: TextStyle( // fontSize: screenWidth / 22)), // ); // }, // popupShape: RoundedRectangleBorder( // borderRadius: BorderRadius.only( // topLeft: Radius.circular(24), // topRight: Radius.circular(24), // ), // ), // validator: (value) { // if (value == null || value.isEmpty) { // return 'This field is required.'; // } // return null; // }, // onSaved: (newValue) { // accountBloc // .currentEditAccount['billing_country'] = // newValue; // }, // )), ])) ])))); }

Widget buildDescriptionBlock() { return Container( margin: EdgeInsets.all(5.0), padding: EdgeInsets.all(5.0), decoration: BoxDecoration( border: Border.all( color: Colors.grey, width: 1.0, ), borderRadius: BorderRadius.all(Radius.circular(5.0)), ), child: Column( children: [ quill.QuillToolbar.basic( controller: _controller, showAlignmentButtons: true, showBackgroundColorButton: false, showCameraButton: false, showImageButton: false, showVideoButton: false, //showDividers: false, showColorButton: false, // showUndo: false, //showRedo: false, showQuote: false, showClearFormat: false, showIndent: false, showLink: false, showCodeBlock: false, showInlineCode: false, showListCheck: false, //showJustifyAlignment: false, showHeaderStyle: false, ), Expanded( child: Container( child: quill.QuillEditor.basic( controller: _controller, readOnly: !_isLoading ? false : true), ), ) ], )); }

@override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Container( decoration: BoxDecoration(color: Color.fromRGBO(73, 128, 255, 1.0)), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Container( padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( child: Row(children: [ GestureDetector( child: new Icon(Icons.arrow_back_ios, size: screenWidth / 18, color: Colors.white), onTap: () { accountBloc.resetAccountFields(); accountBloc.currentEditAccountId = ""; FocusScope.of(context).unfocus(); Navigator.pop(context, true); }), SizedBox(width: 10.0), Text( accountBloc.currentEditAccountId == "" ? 'Add account' : 'Edit account', style: TextStyle( color: Colors.white, fontSize: screenWidth / 20, fontWeight: FontWeight.bold), ), ]), ), GestureDetector( onTap: () { if (_accountFormKey.currentState != null) _accountFormKey.currentState!.save(); accountBloc.currentEditAccount['tags'] = _tagsController.getTags; if (_addressFormKey.currentState != null) _addressFormKey.currentState!.save(); FocusScope.of(context).unfocus(); accountBloc.currentEditAccount['description'] = _controller.document.toPlainText(); if (!_isLoading) _submitForm(); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(3.0)), color: Colors.white, ), width: screenWidth * 0.18, height: screenHeight * 0.04, alignment: Alignment.center, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Icon(Icons.check, color: Theme.of(context).primaryColor, size: screenWidth / 18), Container( child: Text( "Save", style: TextStyle( fontSize: screenWidth / 25, color: Theme.of(context).primaryColor, fontWeight: FontWeight.w500), ), ), ], ), ), ) ], ), ), Container( padding: EdgeInsets.symmetric(horizontal: 23.0), height: screenHeight * 0.06, decoration: BoxDecoration( color: bottomNavBarSelectedTextColor, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: () { if (_addressFormKey.currentState != null) _addressFormKey.currentState!.save(); setState(() { _currentTabIndex = 0; }); }, child: !_isLoading ? Container( alignment: Alignment.center, height: screenHeight * 0.06, decoration: BoxDecoration( border: Border( bottom: BorderSide( color: Colors.white, width: _currentTabIndex == 0 ? 3.0 : 0.0, ))), width: screenWidth * 0.20, child: Text( 'Account', style: TextStyle( color: _currentTabIndex == 0 ? Colors.white : Theme.of(context) .secondaryHeaderColor, fontSize: screenWidth / 25, fontWeight: FontWeight.w500), ), ) : Container(), ), GestureDetector( onTap: () { if (_accountFormKey.currentState != null) _accountFormKey.currentState!.save(); setState(() { _currentTabIndex = 1; }); }, child: !_isLoading ? Container( alignment: Alignment.center, height: screenHeight * 0.06, decoration: BoxDecoration( border: Border( bottom: BorderSide( color: Colors.white, width: _currentTabIndex == 1 ? 3.0 : 0.0, ))), width: screenWidth * 0.20, child: Text( 'Address', style: TextStyle( color: _currentTabIndex == 1 ? Colors.white : Theme.of(context) .secondaryHeaderColor, fontSize: screenWidth / 25, fontWeight: FontWeight.w500), ), ) : Container(), ), GestureDetector( onTap: () { if (_accountFormKey.currentState != null) _accountFormKey.currentState!.save(); if (_addressFormKey.currentState != null) _addressFormKey.currentState!.save(); setState(() { _currentTabIndex = 2; }); }, child: !_isLoading ? Container( alignment: Alignment.center, height: screenHeight * 0.06, decoration: BoxDecoration( border: Border( bottom: BorderSide( color: Colors.white, width: _currentTabIndex == 2 ? 3.0 : 0.0, ))), width: screenWidth * 0.25, child: Text( 'Description', style: TextStyle( color: _currentTabIndex == 2 ? Colors.white : Theme.of(context) .secondaryHeaderColor, fontSize: screenWidth / 25, fontWeight: FontWeight.w500), ), ) : Container(), ), ], ), ), Expanded( child: Stack( fit: StackFit.expand, children: [ Container( color: Colors.white, child: buildTopBar(), ), new Align( child: _isLoading ? Container( color: Colors.white, width: screenWidth, height: screenHeight * 0.9, child: new Padding( padding: const EdgeInsets.all(5.0), child: new Center( child: new CircularProgressIndicator())), ) : Container(), alignment: FractionalOffset.center, ) ], )) ], ), ), ), ); }

_submitForm() async { setState(() { _errors = {}; _isLoading = true; }); _currentTabIndex = 0; await Future.delayed(const Duration(seconds: 1), () async {}); if (_accountFormKey.currentState != null) { if (!_accountFormKey.currentState!.validate()) { setState(() { _isLoading = false; }); showToaster('⚠ Please enter required fields.', context); return; } _accountFormKey.currentState!.save(); setState(() { _currentTabIndex = 1; }); await Future.delayed(const Duration(seconds: 1), () async {}); if (_addressFormKey.currentState != null) { if (!_addressFormKey.currentState!.validate()) { setState(() { _isLoading = false; }); showToaster('⚠ Please enter required fields.', context); return; } _addressFormKey.currentState!.save(); Map _result = {}; if (accountBloc.currentEditAccountId != null && accountBloc.currentEditAccountId != "") { _result = await accountBloc.editAccount(); } else { _result = await accountBloc.createAccount(file: file); } setState(() { _isLoading = false; }); if (_result['error'] == false) { setState(() { _errors = {}; }); accountBloc.resetAccountFields(); accountBloc.currentEditAccountId = ""; showToaster(_result['message'], context); accountBloc.openAccounts.clear(); accountBloc.closedAccounts.clear(); await accountBloc.fetchAccounts(); await FirebaseAnalytics.instance.logEvent(name: "Account_Created"); Navigator.pushReplacementNamed(context, '/accounts_list'); } else if (_result['error'] == true) { setState(() { _errors = _result['errors']; }); for (var key in _accountFormKeys) { if (_errors.containsKey(key)) { setState(() { _currentTabIndex = 0; }); showToaster(_errors[key][0], context); return; } } for (var key in _addressFormKeys) { if (_errors.containsKey(key)) { setState(() { _currentTabIndex = 1; }); showToaster(_errors[key][0], context); return; } } } else { setState(() { _errors = {}; }); showErrorMessage(context, _result['message'].toString()); } } } }

showErrorMessage(BuildContext context, String msg) { return showDialog( context: context, builder: (_) => AlertDialog( title: Text('Alert'), content: Text(msg), actions: [ TextButton( onPressed: () { Navigator.pop(context); _submitForm(); }, child: Text('RETRY')) ], )); } } Capture

Still I'm having same issue

BalaVenkatasainath avatar Jun 29 '22 06:06 BalaVenkatasainath

I hope bug will solve ASAP, my app not working due to this .

SainathChallagundla avatar Jul 21 '22 04:07 SainathChallagundla

Any update on this issue?

jerrypaulsam avatar Jul 27 '22 08:07 jerrypaulsam

Hi, I have the same problem. The Flutter version is 3.0.5 and the package version is 2.0.1. I tested on an Android device.

I reproduced the error in simple code:

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const Home(),
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  late double _distanceToField;
  late TextfieldTagsController _controller;
  bool isSending = false;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _distanceToField = MediaQuery.of(context).size.width;
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  @override
  void initState() {
    super.initState();
    _controller = TextfieldTagsController();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "wellcome",
      home: Scaffold(
          appBar: AppBar(
            backgroundColor: const Color.fromARGB(255, 74, 137, 92),
            centerTitle: true,
            title: const Text('Enter a tag...'),
          ),
          body: isSending
              ? const Center(child: CircularProgressIndicator())
              : Column(children: [
                  TextFieldTags(
                    textfieldTagsController: _controller,
                    initialTags: const [
                      'pick',
                      'your',
                      'favorite',
                      'programming',
                      'language'
                    ],
                    textSeparators: const [' ', ','],
                    letterCase: LetterCase.normal,
                    validator: (String tag) {
                      if (tag == 'php') {
                        return 'No, please just no';
                      } else if (_controller.getTags!.contains(tag)) {
                        return 'you already entered that';
                      }
                      return null;
                    },
                    inputfieldBuilder:
                        (context, tec, fn, error, onChanged, onSubmitted) {
                      return ((context, sc, tags, onTagDelete) {
                        return Padding(
                          padding: const EdgeInsets.all(10.0),
                          child: TextField(
                            controller: tec,
                            focusNode: fn,
                            decoration: InputDecoration(
                              isDense: true,
                              border: const OutlineInputBorder(
                                borderSide: BorderSide(
                                  color: Color.fromARGB(255, 74, 137, 92),
                                  width: 3.0,
                                ),
                              ),
                              focusedBorder: const OutlineInputBorder(
                                borderSide: BorderSide(
                                  color: Color.fromARGB(255, 74, 137, 92),
                                  width: 3.0,
                                ),
                              ),
                              helperText: 'Enter language...',
                              helperStyle: const TextStyle(
                                color: Color.fromARGB(255, 74, 137, 92),
                              ),
                              hintText:
                                  _controller.hasTags ? '' : "Enter tag...",
                              errorText: error,
                              prefixIconConstraints: BoxConstraints(
                                  maxWidth: _distanceToField * 0.74),
                              prefixIcon: tags.isNotEmpty
                                  ? SingleChildScrollView(
                                      controller: sc,
                                      scrollDirection: Axis.horizontal,
                                      child: Row(
                                          children: tags.map((String tag) {
                                        return Container(
                                          decoration: const BoxDecoration(
                                            borderRadius: BorderRadius.all(
                                              Radius.circular(20.0),
                                            ),
                                            color: Color.fromARGB(
                                                255, 74, 137, 92),
                                          ),
                                          margin: const EdgeInsets.symmetric(
                                              horizontal: 5.0),
                                          padding: const EdgeInsets.symmetric(
                                              horizontal: 10.0, vertical: 5.0),
                                          child: Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.spaceBetween,
                                            children: [
                                              InkWell(
                                                child: Text(
                                                  '#$tag',
                                                  style: const TextStyle(
                                                      color: Colors.white),
                                                ),
                                                onTap: () {
                                                  print("$tag selected");
                                                },
                                              ),
                                              const SizedBox(width: 4.0),
                                              InkWell(
                                                child: const Icon(
                                                  Icons.cancel,
                                                  size: 14.0,
                                                  color: Color.fromARGB(
                                                      255, 233, 233, 233),
                                                ),
                                                onTap: () {
                                                  onTagDelete(tag);
                                                },
                                              )
                                            ],
                                          ),
                                        );
                                      }).toList()),
                                    )
                                  : null,
                            ),
                            onChanged: onChanged,
                            onSubmitted: onSubmitted,
                          ),
                        );
                      });
                    },
                  ),
                  ElevatedButton(
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all<Color>(
                        const Color.fromARGB(255, 74, 137, 92),
                      ),
                    ),
                    onPressed: () async {
                      setState(() {
                        isSending = true;
                      });
                      // simulate validations
                      await Future.delayed(const Duration(seconds: 3));
                      // simulate failed validations and display text field tags again
                      setState(() {
                        isSending = false;
                      });
                    },
                    child: const Text('SEND'),
                  ),
                ])),
    );
  }
}

The error messages:

======== Exception caught by widgets library =======================================================
The following LateError was thrown building _BodyBuilder:
LateInitializationError: Field '_textSeparators@586091221' has already been initialized.

The relevant error-causing widget was: 
  Scaffold Scaffold:file:///home/ixam/projects/text_field_bug/lib/main.dart:57:13
When the exception was thrown, this was the stack: 
#0      LateError._throwFieldAlreadyInitialized (dart:_internal-patch/internal_patch.dart:194:5)
#1      TextfieldTagsNotifier._textSeparators= (package:textfield_tags/src/controller.dart:29:27)
#2      TextfieldTagsNotifier.initS (package:textfield_tags/src/controller.dart:39:5)
#3      TextfieldTagsController.init (package:textfield_tags/src/controller.dart:73:11)
#4      _TextFieldTagsState.initState (package:textfield_tags/src/main.dart:56:9)
#5      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4942:57)
#6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4781:5)
#7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#8      MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6350:36)
#9      MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6362:32)
#10     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#11     Element.updateChild (package:flutter/src/widgets/framework.dart:3545:20)
#12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#13     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#14     StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#15     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#18     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#19     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#21     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#22     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#23     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#24     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5825:32)
#25     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6375:17)
#26     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#27     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#28     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#30     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#31     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#33     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#34     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#35     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#37     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#38     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#39     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#40     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#41     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#42     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#43     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#44     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#45     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#46     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#47     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#48     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#49     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#50     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#51     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#52     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#53     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#54     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#55     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#56     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#57     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#60     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#61     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#62     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#63     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#64     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#65     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#66     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#68     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#69     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#70     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#71     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#73     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#74     ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#75     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#77     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#78     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#79     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#80     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#81     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#82     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#83     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#84     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#85     StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#86     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#87     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#88     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#89     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#90     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#91     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#92     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#93     Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#94     StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#95     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#96     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#97     Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#98     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#99     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#100    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#101    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#102    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#103    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#104    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#105    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#106    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#107    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#108    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#109    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#110    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#111    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#112    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#113    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#114    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#115    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#116    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#117    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#118    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#119    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#120    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#121    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#122    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#123    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#124    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#125    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#126    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#127    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#128    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#129    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#130    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#131    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#132    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#133    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#134    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#135    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#136    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#137    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#138    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#139    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#140    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#141    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#142    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#143    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#144    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#145    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#146    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#147    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#148    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#149    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#150    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#151    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#152    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#153    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#154    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#155    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#156    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#157    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#158    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#159    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#160    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#161    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#162    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#163    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#164    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#165    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#166    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#167    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#168    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#169    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#170    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#171    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#172    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#173    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#174    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#175    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#176    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#177    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#178    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#179    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#180    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#181    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#182    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#183    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#184    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#185    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#186    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#187    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#188    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11)
#189    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#190    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#191    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#192    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#193    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#194    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#195    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#196    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#197    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#198    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#199    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#200    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#201    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#202    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#203    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#204    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#205    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#206    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#207    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#208    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#209    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#210    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#211    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#212    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#213    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#214    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#215    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#216    StatelessElement.update (package:flutter/src/widgets/framework.dart:4883:5)
#217    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#218    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#219    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#220    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#221    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#222    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#223    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#224    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#225    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#226    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#227    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#228    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#229    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#230    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#231    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#232    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#233    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#234    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#235    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#236    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#237    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#238    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#239    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#240    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#241    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)
#242    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:891:21)
#243    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#244    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#245    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#246    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#250    _invoke (dart:ui/hooks.dart:151:10)
#251    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#252    _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)
====================================================================================================

======== Exception caught by rendering library =====================================================
The following assertion was thrown during performLayout():
Each child must be laid out exactly once.

The _ScaffoldLayout custom multichild layout delegate forgot to lay out the following child: 
  _ScaffoldSlot.body: RenderErrorBox#2e5b3 NEEDS-LAYOUT NEEDS-PAINT
    parentData: offset=Offset(0.0, 0.0); id=_ScaffoldSlot.body
    constraints: MISSING
    size: MISSING
The relevant error-causing widget was: 
  Scaffold Scaffold:file:///home/ixam/projects/text_field_bug/lib/main.dart:57:13
When the exception was thrown, this was the stack: 
#0      MultiChildLayoutDelegate._callPerformLayout.<anonymous closure> (package:flutter/src/rendering/custom_layout.dart:243:11)
#1      MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:255:8)
#2      RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#3      RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1757:7)
#4      PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#5      RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:504:19)
#6      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892:13)
#7      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#8      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#9      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#10     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#14     _invoke (dart:ui/hooks.dart:151:10)
#15     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#16     _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)
The following RenderObject was being processed when the exception was fired: RenderCustomMultiChildLayoutBox#04dbd NEEDS-LAYOUT NEEDS-COMPOSITING-BITS-UPDATE
...  needs compositing
...  parentData: <none> (can use size)
...  constraints: BoxConstraints(w=411.4, h=890.3)
...  size: Size(411.4, 890.3)
RenderObject: RenderCustomMultiChildLayoutBox#04dbd NEEDS-LAYOUT NEEDS-COMPOSITING-BITS-UPDATE
  needs compositing
  parentData: <none> (can use size)
  constraints: BoxConstraints(w=411.4, h=890.3)
  size: Size(411.4, 890.3)
...  child 1: RenderErrorBox#2e5b3 NEEDS-LAYOUT NEEDS-PAINT
...    parentData: offset=Offset(0.0, 0.0); id=_ScaffoldSlot.body
...    constraints: MISSING
...    size: MISSING
...  child 2: RenderFlex#21c33 relayoutBoundary=up1 NEEDS-PAINT
...    parentData: offset=Offset(0.0, 94.1); id=_ScaffoldSlot.body (can use size)
...    constraints: BoxConstraints(0.0<=w<=411.4, 0.0<=h<=796.2)
...    size: Size(0.0, 796.2)
...    direction: vertical
...    mainAxisAlignment: start
...    mainAxisSize: max
...    crossAxisAlignment: center
...    verticalDirection: down
...  child 3: RenderConstrainedBox#97f0d relayoutBoundary=up1
...    needs compositing
...    parentData: offset=Offset(0.0, 0.0); id=_ScaffoldSlot.appBar (can use size)
...    constraints: BoxConstraints(w=411.4, 0.0<=h<=890.3)
...    size: Size(411.4, 94.1)
...    additionalConstraints: BoxConstraints(0.0<=w<=Infinity, 0.0<=h<=94.1)
...    child: RenderSemanticsAnnotations#56a32 relayoutBoundary=up2
...      needs compositing
...      parentData: <none> (can use size)
...      constraints: BoxConstraints(w=411.4, 0.0<=h<=94.1)
...      semantic boundary
...      size: Size(411.4, 94.1)
...      child: RenderAnnotatedRegion<SystemUiOverlayStyle>#e9cd0 relayoutBoundary=up3
...        needs compositing
...        parentData: <none> (can use size)
...        constraints: BoxConstraints(w=411.4, 0.0<=h<=94.1)
...        size: Size(411.4, 94.1)
...        child: RenderPhysicalModel#deda9 relayoutBoundary=up4
...          needs compositing
...          parentData: <none> (can use size)
...          constraints: BoxConstraints(w=411.4, 0.0<=h<=94.1)
...          layer: PhysicalModelLayer#ff38b
...            engine layer: PhysicalShapeEngineLayer#e8dfa
...            handles: 2
...            elevation: 4.0
...            color: Color(0xff4a895c)
...          size: Size(411.4, 94.1)
...          elevation: 4.0
...          color: Color(0xff4a895c)
...          shadowColor: Color(0xff4a895c)
...          shape: BoxShape.rectangle
...          borderRadius: BorderRadius.zero
...  child 4: RenderStack#47588 relayoutBoundary=up1
...    parentData: offset=Offset(395.4, 874.3); id=_ScaffoldSlot.floatingActionButton (can use size)
...    constraints: BoxConstraints(0.0<=w<=411.4, 0.0<=h<=890.3)
...    size: Size(0.0, 0.0)
...    alignment: Alignment.centerRight
...    textDirection: ltr
...    fit: loose
...    child 1: RenderTransform#b713f relayoutBoundary=up2
...      parentData: not positioned; offset=Offset(0.0, 0.0) (can use size)
...      constraints: BoxConstraints(0.0<=w<=411.4, 0.0<=h<=890.3)
...      size: Size(0.0, 0.0)
...      transform matrix: [0] 0.0,0.0,0.0,0.0
[1] 0.0,0.0,0.0,0.0
[2] 0.0,0.0,1.0,0.0
[3] 0.0,0.0,0.0,1.0
...      origin: null
...      alignment: Alignment.center
...      textDirection: ltr
...      transformHitTests: true
...      child: RenderTransform#ab485 relayoutBoundary=up3
...        parentData: <none> (can use size)
...        constraints: BoxConstraints(0.0<=w<=411.4, 0.0<=h<=890.3)
...        size: Size(0.0, 0.0)
...        transform matrix: [0] 0.7,0.7,0.0,0.0
[1] -0.7,0.7,0.0,0.0
[2] 0.0,0.0,1.0,0.0
[3] 0.0,0.0,0.0,1.0
...        origin: null
...        alignment: Alignment.center
...        textDirection: ltr
...        transformHitTests: true
====================================================================================================

maxicc4 avatar Jul 28 '22 03:07 maxicc4

The error occurs when I have to re-display TextFieldTags

maxicc4 avatar Jul 28 '22 03:07 maxicc4

https://github.com/eyoeldefare/textfield_tags/blob/8a8c889cf2f7624ebf069bd5758b198c03af118c/lib/src/controller.dart#L26-L30

Removing the final keywords solves the issue.

aschung01 avatar Jul 30 '22 13:07 aschung01

After solving the current issue, another issue occurs:

  1. User goes back to previous screen and comes back
  2. User types into the TextFieldTags textfield
  3. When a textSeperator input or onSubmitted event happens, the error setState() called after dispose(): _TextFieldTagsState#246a0(lifecycle state: defunct, not mounted is thrown.

aschung01 avatar Jul 30 '22 13:07 aschung01

After solving the current issue, another issue occurs:

  1. User goes back to previous screen and comes back
  2. User types into the TextFieldTags textfield
  3. When a textSeperator input or onSubmitted event happens, the error setState() called after dispose(): _TextFieldTagsState#246a0(lifecycle state: defunct, not mounted is thrown.

The following change seems to resolve this issue. https://github.com/eyoeldefare/textfield_tags/blob/8a8c889cf2f7624ebf069bd5758b198c03af118c/lib/src/main.dart#L69-L74 Update the code above:

_ttc.addListener(() {
  if (mounted) {
     setState(() {
       _error = _ttc.getError;
       _tags = _ttc.getTags;
     });
 }
});

aschung01 avatar Jul 30 '22 13:07 aschung01

After solving the current issue, another issue occurs:

  1. User goes back to previous screen and comes back
  2. User types into the TextFieldTags textfield
  3. When a textSeperator input or onSubmitted event happens, the error setState() called after dispose(): _TextFieldTagsState#246a0(lifecycle state: defunct, not mounted is thrown.

The following change seems to resolve this issue.

https://github.com/eyoeldefare/textfield_tags/blob/8a8c889cf2f7624ebf069bd5758b198c03af118c/lib/src/main.dart#L69-L74

Update the code above:

_ttc.addListener(() {
  if (mounted) {
     setState(() {
       _error = _ttc.getError;
       _tags = _ttc.getTags;
     });
 }
});
`Doing as you showed above did not solve the problem

SainathChallagundla avatar Aug 08 '22 10:08 SainathChallagundla

There is a PR to solve this issue, I will merge when I have free time.

eyoeldefare avatar Aug 10 '22 18:08 eyoeldefare

There is a PR to solve this issue, I will merge when I have free time.

I hope it will merge ASAP

SainathChallagundla avatar Aug 11 '22 04:08 SainathChallagundla

Thank you for awesome package. I am facing to same issue. Please merge the PR when you have time.

sakatech-jp avatar Aug 14 '22 06:08 sakatech-jp

I tinkered with the code locally and have found that the issue is due to the controller being initialised on the widget's initState. This is especially troublesome if you want to keep the controller in a state outside the widget itself. Essentially, if you have a ListView or PageView that disposes the widget, but keeping the controller alive somewhere else such as in a statement management solution (in my case GetxController). Took me a few tries, but the below code has now solved my problem:

main.dart

@override
  void initState() {
    super.initState();
    _ttc = widget.textfieldTagsController ?? TextfieldTagsController();
    if (!_ttc.isInitialised) {
      _ttc
        ..init(
          widget.validator,
          widget.letterCase,
          widget.initialTags,
          widget.textEditingController,
          widget.focusNode,
          widget.textSeparators,
        )
        ..scrollTags(forward: true);
    }

    _error = _ttc.getError;
    _tags = _ttc.getTags;

    _ttc.addListener(() {
      setState(() {
        _error = _ttc.getError;
        _tags = _ttc.getTags;
      });
    });
  }

controller.dart

  bool _isInitialised = false;
  bool get isInitialised => _isInitialised;

  TextfieldTagsController();

  void init(
    Validator? validator,
    LetterCase? letterCase,
    List<String>? initialTags,
    TextEditingController? tec,
    FocusNode? fn,
    List<String>? textSeparators,
  ) {
    super.initS(initialTags, tec, fn, textSeparators);
    _letterCase = letterCase ?? LetterCase.normal;
    _validator = validator;
    _isInitialised = true;
  }

lhengl avatar Sep 03 '22 01:09 lhengl