Untitled
unknown
plain_text
a year ago
15 kB
3
Indexable
Never
/*library countrycodepicker; import 'package:flutter/material.dart'; import 'package:flutter_sim_country_code/flutter_sim_country_code.dart'; import 'package:flutter/scheduler.dart'; import 'country.dart'; import 'functions.dart'; const TextStyle _defaultItemTextStyle = const TextStyle(fontSize: 16); const TextStyle _defaultSearchInputStyle = const TextStyle(fontSize: 16); const String _kDefaultSearchHintText = 'Search country name, code'; const String countryCodePackageName = 'country_calling_code_picker'; class CountryPickerWidget extends StatefulWidget { /// This callback will be called on selection of a [Country]. final ValueChanged<Country>? onSelected; /// [itemTextStyle] can be used to change the TextStyle of the Text in ListItem. Default is [_defaultItemTextStyle] final TextStyle itemTextStyle; /// [searchInputStyle] can be used to change the TextStyle of the Text in SearchBox. Default is [searchInputStyle] final TextStyle searchInputStyle; /// [searchInputDecoration] can be used to change the decoration for SearchBox. final InputDecoration? searchInputDecoration; /// Flag icon size (width). Default set to 32. final double flagIconSize; ///Can be set to `true` for showing the List Separator. Default set to `false` final bool showSeparator; ///Can be set to `true` for opening the keyboard automatically. Default set to `false` final bool focusSearchBox; ///This will change the hint of the search box. Alternatively [searchInputDecoration] can be used to change decoration fully. final String searchHintText; const CountryPickerWidget({ Key? key, this.onSelected, this.itemTextStyle = _defaultItemTextStyle, this.searchInputStyle = _defaultSearchInputStyle, this.searchInputDecoration, this.searchHintText = _kDefaultSearchHintText, this.flagIconSize = 32, this.showSeparator = false, this.focusSearchBox = false, }) : super(key: key); @override _CountryPickerWidgetState createState() => _CountryPickerWidgetState(); } class _CountryPickerWidgetState extends State<CountryPickerWidget> { List<Country> _list = []; List<Country> _filteredList = []; TextEditingController _controller = new TextEditingController(); ScrollController _scrollController = new ScrollController(); bool _isLoading = false; Country? _currentCountry; void _onSearch(text) { if (text == null || text.isEmpty) { setState(() { _filteredList.clear(); _filteredList.addAll(_list); }); } else { setState(() { _filteredList = _list .where((element) => element.name .toLowerCase() .contains(text.toString().toLowerCase()) || element.callingCode .toLowerCase() .contains(text.toString().toLowerCase()) || element.countryCode .toLowerCase() .startsWith(text.toString().toLowerCase())) .map((e) => e) .toList(); }); } } @override void initState() { _scrollController.addListener(() { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } }); loadList(); super.initState(); } void loadList() async { setState(() { _isLoading = true; }); _list = await getCountries(context); try { String? code = await FlutterSimCountryCode.simCountryCode; _currentCountry = _list.firstWhere((element) => element.countryCode == code); final country = _currentCountry; if (country != null) { _list.removeWhere( (element) => element.callingCode == country.callingCode); _list.insert(0, country); } } catch (e) {} finally { setState(() { _filteredList = _list.map((e) => e).toList(); _isLoading = false; }); } } @override Widget build(BuildContext context) { return Column( children: <Widget>[ SizedBox( height: 16, ), Padding( padding: const EdgeInsets.only(left: 24, right: 24), child: TextField( style: TextStyle(fontSize: 16,color: Colors.black), autofocus: widget.focusSearchBox, decoration: widget.searchInputDecoration ?? InputDecoration( enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(30),borderSide: BorderSide(color: Colors.black)), focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(30),borderSide: BorderSide(color: Colors.black)), suffixIcon: Visibility( visible: _controller.text.isNotEmpty, child: InkWell( child: Icon(Icons.clear, color: Colors.black ), onTap: () => setState(() { _controller.clear(); _filteredList.clear(); _filteredList.addAll(_list); }), ), ), contentPadding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 8), hintText: widget.searchHintText, hintStyle: TextStyle(color: Colors.black) ), textInputAction: TextInputAction.done, controller: _controller, onChanged: _onSearch, ), ), SizedBox( height: 16, ), Expanded( child: _isLoading ? Center(child: CircularProgressIndicator()) : ListView.separated( padding: EdgeInsets.only(top: 16), controller: _scrollController, itemCount: _filteredList.length, separatorBuilder: (_, index) => widget.showSeparator ? Divider() : Container(), itemBuilder: (_, index) { return InkWell( onTap: () { widget.onSelected?.call(_filteredList[index]); }, child: Container( padding: EdgeInsets.only( bottom: 12, top: 12, left: 24, right: 24), child: Row( children: <Widget>[ Image.asset( _filteredList[index].flag, package: countryCodePackageName, width: widget.flagIconSize, ), SizedBox( width: 16, ), Expanded( child: Text( '${_filteredList[index].callingCode} ${_filteredList[index].name}', style: widget.itemTextStyle, )), ], ), ), ); }, ), ) ], ); } @override void dispose() { _scrollController.dispose(); _controller.dispose(); super.dispose(); } } */ library countrycodepicker; import 'package:flutter/material.dart'; import 'package:flutter_sim_country_code/flutter_sim_country_code.dart'; import 'package:flutter/scheduler.dart'; import 'country.dart'; import 'functions.dart'; const TextStyle _defaultItemTextStyle = const TextStyle(fontSize: 16); const TextStyle _defaultSearchInputStyle = const TextStyle(fontSize: 16); const String _kDefaultSearchHintText = 'Search country name, code'; const String countryCodePackageName = 'country_calling_code_picker'; class CountryPickerWidget extends StatefulWidget { /// This callback will be called on selection of a [Country]. final ValueChanged<Country>? onSelected; /// [itemTextStyle] can be used to change the TextStyle of the Text in ListItem. Default is [_defaultItemTextStyle] final TextStyle itemTextStyle; /// [searchInputStyle] can be used to change the TextStyle of the Text in SearchBox. Default is [searchInputStyle] final TextStyle searchInputStyle; /// [searchInputDecoration] can be used to change the decoration for SearchBox. final InputDecoration? searchInputDecoration; /// Flag icon size (width). Default set to 32. final double flagIconSize; ///Can be set to `true` for showing the List Separator. Default set to `false` final bool showSeparator; ///Can be set to `true` for opening the keyboard automatically. Default set to `false` final bool focusSearchBox; ///This will change the hint of the search box. Alternatively [searchInputDecoration] can be used to change decoration fully. final String searchHintText; const CountryPickerWidget({ Key? key, this.onSelected, this.itemTextStyle = _defaultItemTextStyle, this.searchInputStyle = _defaultSearchInputStyle, this.searchInputDecoration, this.searchHintText = _kDefaultSearchHintText, this.flagIconSize = 32, this.showSeparator = false, this.focusSearchBox = false, }) : super(key: key); @override _CountryPickerWidgetState createState() => _CountryPickerWidgetState(); } class _CountryPickerWidgetState extends State<CountryPickerWidget> { List<Country> _list = []; List<Country> _filteredList = []; TextEditingController _controller = new TextEditingController(); ScrollController _scrollController = new ScrollController(); bool _isLoading = false; Country? _currentCountry; void _onSearch(text) { if (text == null || text.isEmpty) { setState(() { _filteredList.clear(); _filteredList.addAll(_list); }); } else { setState(() { _filteredList = _list .where((element) => element.name .toLowerCase() .contains(text.toString().toLowerCase()) || element.callingCode .toLowerCase() .contains(text.toString().toLowerCase()) || element.countryCode .toLowerCase() .startsWith(text.toString().toLowerCase())) .map((e) => e) .toList(); }); } } @override void initState() { _scrollController.addListener(() { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } }); loadList(); super.initState(); } void loadList() async { setState(() { _isLoading = true; }); _list = await getCountries(context); try { String? code = await FlutterSimCountryCode.simCountryCode; _currentCountry = _list.firstWhere((element) => element.countryCode == code); final country = _currentCountry; if (country != null) { _list.removeWhere( (element) => element.callingCode == country.callingCode); _list.insert(0, country); } } catch (e) {} finally { setState(() { _filteredList = _list.map((e) => e).toList(); _isLoading = false; }); } } @override Widget build(BuildContext context) { return Column( children: <Widget>[ SizedBox( height: 16, ), Padding( padding: const EdgeInsets.only(left: 24, right: 24), child: TextField( style: TextStyle(fontSize: 16,color: true ? Colors.white : Colors.black), autofocus: widget.focusSearchBox, decoration: widget.searchInputDecoration ?? InputDecoration( enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(30),borderSide: BorderSide(color: true ? Colors.white : Colors.black)), focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(30),borderSide: BorderSide(color: true ? Colors.white : Colors.black)), suffixIcon: Visibility( visible: _controller.text.isNotEmpty, child: InkWell( child: Icon(Icons.clear, color: true ? Colors.white : Colors.black ), onTap: () => setState(() { _controller.clear(); _filteredList.clear(); _filteredList.addAll(_list); }), ), ), contentPadding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 8), hintText: widget.searchHintText, hintStyle: TextStyle(color: true ? Colors.white : Colors.black) ), textInputAction: TextInputAction.done, controller: _controller, onChanged: _onSearch, ), ), SizedBox( height: 16, ), Expanded( child: _isLoading ? Center(child: CircularProgressIndicator()) : ListView.separated( padding: EdgeInsets.only(top: 16), controller: _scrollController, itemCount: _filteredList.length, separatorBuilder: (_, index) => widget.showSeparator ? Divider() : Container(), itemBuilder: (_, index) { return InkWell( onTap: () { widget.onSelected?.call(_filteredList[index]); }, child: Container( padding: EdgeInsets.only( bottom: 12, top: 12, left: 24, right: 24), child: Row( children: <Widget>[ Image.asset( _filteredList[index].flag, package: countryCodePackageName, width: widget.flagIconSize, ), SizedBox( width: 16, ), Expanded( child: Text( '${_filteredList[index].callingCode} ${_filteredList[index].name}', style: widget.itemTextStyle, )), ], ), ), ); }, ), ) ], ); } @override void dispose() { _scrollController.dispose(); _controller.dispose(); super.dispose(); } }