Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

textSeparators issue #62

Closed
BalaVenkatasainath opened this issue Jun 23, 2022 · 21 comments
Closed

textSeparators issue #62

BalaVenkatasainath opened this issue Jun 23, 2022 · 21 comments
Labels
bug Something isn't working

Comments

@BalaVenkatasainath
Copy link

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.

@Basil-Baby-94
Copy link

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,

@BalaVenkatasainath
Copy link
Author

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

@Basil-Baby-94
Copy link

@eyoeldefare could you please check?

@eyoeldefare
Copy link
Owner

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?

@BalaVenkatasainath
Copy link
Author

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 createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
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
Copy link
Author

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

@eyoeldefare
Copy link
Owner

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 eyoeldefare added the bug Something isn't working label Jun 28, 2022
@BalaVenkatasainath
Copy link
Author

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? get getTags
if I remove "!" it I'm getting error
tags issue

@BalaVenkatasainath
Copy link
Author

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 {
int _currentTabIndex = 0;
quill.QuillController _controller = quill.QuillController.basic();
GlobalKey _accountFormKey = GlobalKey();
GlobalKey _addressFormKey = GlobalKey();
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(
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(
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(
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(
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(
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(
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(
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(
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: [
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(
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(
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(
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

@SainathChallagundla
Copy link

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

@jerrypaulsam
Copy link

Any update on this issue?

@maxicc4
Copy link

maxicc4 commented Jul 28, 2022

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
Copy link

maxicc4 commented Jul 28, 2022

The error occurs when I have to re-display TextFieldTags

@aschung01
Copy link
Contributor

late final TextEditingController? textEditingController;
late final FocusNode? focusNode;
late final Set<String>? _textSeparators;
late final List<String>? _tags;

Removing the final keywords solves the issue.

@aschung01
Copy link
Contributor

aschung01 commented Jul 30, 2022

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
Copy link
Contributor

aschung01 commented Jul 30, 2022

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.

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

Update the code above:

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

aschung01 added a commit to aschung01/textfield_tags that referenced this issue Jul 30, 2022
@SainathChallagundla
Copy link

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.

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

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

@eyoeldefare
Copy link
Owner

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

@SainathChallagundla
Copy link

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

I hope it will merge ASAP

@sakatech-jp
Copy link

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

@lhengl
Copy link

lhengl commented Sep 3, 2022

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;
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

9 participants