gpt4 book ai didi

android - Flutter DropDownSearch 值在将焦点更改为其他小部件时重置

转载 作者:行者123 更新时间:2023-12-03 02:59:05 28 4
gpt4 key购买 nike

我正在使用 dropdownsearch为了在布局中创建下拉搜索小部件,当我将焦点更改为其他小部件时,每次都会重置值类型。该插件还有一个名为 selected item 的属性,如果您在更改焦点时使用它,它将重置为最初选择的项目。
enter image description here
enter image description here/dropdown_search/示例
这是我的代码:

DropdownSearch<StudyName>(
mode: Mode.BOTTOM_SHEET,

items: _studyNamemodel,
itemAsString: (StudyName u) => u.studyName,
onChanged: (StudyName data) { print(data.modalityIDFkey);
//FocusScope.of(context).nextFocus();
_selectedStudyname=data.studyName;
},
maxHeight: 300,
onFind: (String filter) => getData(filter),
label: "Study Name",
),

最佳答案

您可以在下面复制粘贴运行完整代码
我用官方的例子来模拟这种情况
为避免重建清除选定项,您需要使用 selectedItem: _selectedonChanged_selected = data;在工作演示中,您可以在 Hot reload 之后看到, User仍然被正确选择并且Person已重置
带有您的代码的代码段

StudyName _selected;

DropdownSearch<StudyName>(
selectedItem: _selected,
mode: Mode.BOTTOM_SHEET,
items: _studyNamemodel,
itemAsString: (StudyName u) => u.studyName,
onChanged: (StudyName data) {
_selected = data;

print(data.modalityIDFkey);
//FocusScope.of(context).nextFocus();
_selectedStudyname=data.studyName;
},
maxHeight: 300,
onFind: (String filter) => getData(filter),
label: "Study Name",
),
带有官方示例的代码 fragment
UserModel _selectedItemUser;
...
DropdownSearch<UserModel>(
selectedItem: _selectedItemUser,
mode: Mode.BOTTOM_SHEET,
isFilteredOnline: true,
showClearButton: true,
showSearchBox: true,
label: 'User *',
dropdownSearchDecoration: InputDecoration(
filled: true,
fillColor:
Theme.of(context).inputDecorationTheme.fillColor),
//autoValidate: true,
validator: (UserModel u) =>
u == null ? "user field is required " : null,
onFind: (String filter) => getData(filter),
onChanged: (UserModel data) {
print(data);
_selectedItemUser = data;
},
dropdownBuilder: _customDropDownExample,
popupItemBuilder: _customPopupItemBuilderExample,
),
工作演示
enter image description here
完整代码
import 'package:dio/dio.dart';
import 'package:dropdown_search/dropdown_search.dart';
import 'package:flutter/material.dart';

class UserModel {
final String id;
final DateTime createdAt;
final String name;
final String avatar;

UserModel({this.id, this.createdAt, this.name, this.avatar});

factory UserModel.fromJson(Map<String, dynamic> json) {
if (json == null) return null;
return UserModel(
id: json["id"],
createdAt:
json["createdAt"] == null ? null : DateTime.parse(json["createdAt"]),
name: json["name"],
avatar: json["avatar"],
);
}

static List<UserModel> fromJsonList(List list) {
if (list == null) return null;
return list.map((item) => UserModel.fromJson(item)).toList();
}

///this method will prevent the override of toString
String userAsString() {
return '#${this.id} ${this.name}';
}

///this method will prevent the override of toString
bool userFilterByCreationDate(String filter) {
return this?.createdAt?.toString()?.contains(filter);
}

///custom comparing function to check if two users are equal
bool isEqual(UserModel model) {
return this?.id == model?.id;
}

@override
String toString() => name;
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
//enable this line if you want test Dark Mode
//theme: ThemeData.dark(),
home: MyHomePage(),
);
}
}

class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
final _formKey = GlobalKey<FormState>();
String _selectedItemCountry = "Italia";
UserModel _selectedItemUser;

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("DropdownSearch Demo")),
body: Padding(
padding: const EdgeInsets.all(25),
child: Form(
key: _formKey,
autovalidate: true,
child: ListView(
padding: EdgeInsets.all(4),
children: <Widget>[
///Menu Mode with no searchBox
DropdownSearch<String>(
validator: (v) => v == null ? "required field" : null,
hint: "Select a country",
mode: Mode.MENU,
showSelectedItem: true,
items: ["Brazil", "Italia (Disabled)", "Tunisia", 'Canada'],
label: "Menu mode *",
showClearButton: true,
onChanged: print,
popupItemDisabled: (String s) => s.startsWith('I'),
selectedItem: "Brazil",
),
Divider(),
DropdownSearch<UserModel>(
selectedItem: _selectedItemUser,
mode: Mode.BOTTOM_SHEET,
isFilteredOnline: true,
showClearButton: true,
showSearchBox: true,
label: 'User *',
dropdownSearchDecoration: InputDecoration(
filled: true,
fillColor:
Theme.of(context).inputDecorationTheme.fillColor),
//autoValidate: true,
validator: (UserModel u) =>
u == null ? "user field is required " : null,
onFind: (String filter) => getData(filter),
onChanged: (UserModel data) {
print(data);
_selectedItemUser = data;
},
dropdownBuilder: _customDropDownExample,
popupItemBuilder: _customPopupItemBuilderExample,
),
Divider(),

///custom itemBuilder and dropDownBuilder
DropdownSearch<UserModel>(
showSelectedItem: true,
compareFn: (UserModel i, UserModel s) => i.isEqual(s),
label: "Person",
onFind: (String filter) => getData(filter),
onChanged: (UserModel data) {
print(data);
},
dropdownBuilder: _customDropDownExample,
popupItemBuilder: _customPopupItemBuilderExample2,
),
Divider(),

///BottomSheet Mode with no searchBox
DropdownSearch<String>(
mode: Mode.BOTTOM_SHEET,
maxHeight: 300,
items: ["Brazil", "Italia", "Tunisia", 'Canada'],
label: "Custom BottomShet mode",
onChanged: print,
selectedItem: _selectedItemCountry,
showSearchBox: true,
searchBoxDecoration: InputDecoration(
border: OutlineInputBorder(),
contentPadding: EdgeInsets.fromLTRB(12, 12, 8, 0),
labelText: "Search a country",
),
popupTitle: Container(
height: 50,
decoration: BoxDecoration(
color: Theme.of(context).primaryColorDark,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Center(
child: Text(
'Country',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
popupShape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(24),
topRight: Radius.circular(24),
),
),
),
Divider(),

///merge online and offline data in the same list and set custom max Height
DropdownSearch<UserModel>(
items: [
UserModel(name: "Offline name1", id: "999"),
UserModel(name: "Offline name2", id: "0101")
],
maxHeight: 300,
onFind: (String filter) => getData(filter),
label: "choose a user",
onChanged: print,
showSearchBox: true,
),
Divider(),
],
),
),
),
);
}

Widget _customDropDownExample(
BuildContext context, UserModel item, String itemDesignation) {
return Container(
child: (item?.avatar == null)
? ListTile(
contentPadding: EdgeInsets.all(0),
leading: CircleAvatar(),
title: Text("No item selected"),
)
: ListTile(
contentPadding: EdgeInsets.all(0),
leading: CircleAvatar(
backgroundImage: NetworkImage(item.avatar),
),
title: Text("Dropdown ${item.name}"),
subtitle: Text(
item.createdAt.toString(),
),
),
);
}

Widget _customPopupItemBuilderExample(
BuildContext context, UserModel item, bool isSelected) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 8),
decoration: !isSelected
? null
: BoxDecoration(
border: Border.all(color: Theme.of(context).primaryColor),
borderRadius: BorderRadius.circular(5),
color: Colors.white,
),
child: ListTile(
selected: isSelected,
title: Text("Popup ${item.name}"),
subtitle: Text(item.createdAt.toString()),
leading: CircleAvatar(
backgroundImage: NetworkImage(item.avatar),
),
),
);
}

Widget _customPopupItemBuilderExample2(
BuildContext context, UserModel item, bool isSelected) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 8),
decoration: !isSelected
? null
: BoxDecoration(
border: Border.all(color: Theme.of(context).primaryColor),
borderRadius: BorderRadius.circular(5),
color: Colors.white,
),
child: ListTile(
selected: isSelected,
title: Text(item.name),
subtitle: Text(item.createdAt.toString()),
leading: CircleAvatar(
backgroundImage: NetworkImage(item.avatar),
),
),
);
}

Future<List<UserModel>> getData(filter) async {
var response = await Dio().get(
"https://5d85ccfb1e61af001471bf60.mockapi.io/user",
queryParameters: {"filter": filter},
);

var models = UserModel.fromJsonList(response.data);
return models;
}
}

关于android - Flutter DropDownSearch 值在将焦点更改为其他小部件时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64471581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com