textfield_tags
textfield_tags copied to clipboard
textSeparators issue
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.
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,
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
@eyoeldefare could you please check?
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?
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")) ], ), ); } }
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
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'; }
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
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'))
],
));
}
}
Still I'm having same issue
I hope bug will solve ASAP, my app not working due to this .
Any update on this issue?
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
====================================================================================================
The error occurs when I have to re-display TextFieldTags
https://github.com/eyoeldefare/textfield_tags/blob/8a8c889cf2f7624ebf069bd5758b198c03af118c/lib/src/controller.dart#L26-L30
Removing the final
keywords solves the issue.
After solving the current issue, another issue occurs:
- User goes back to previous screen and comes back
- User types into the TextFieldTags textfield
- When a textSeperator input or onSubmitted event happens, the error
setState() called after dispose(): _TextFieldTagsState#246a0(lifecycle state: defunct, not mounted
is thrown.
After solving the current issue, another issue occurs:
- User goes back to previous screen and comes back
- User types into the TextFieldTags textfield
- 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;
});
}
});
After solving the current issue, another issue occurs:
- User goes back to previous screen and comes back
- User types into the TextFieldTags textfield
- 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
There is a PR to solve this issue, I will merge when I have free time.
There is a PR to solve this issue, I will merge when I have free time.
I hope it will merge ASAP
Thank you for awesome package. I am facing to same issue. Please merge the PR when you have time.
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;
}