我对flutter有问题,当用户按下特定按钮时,我创建了一个弹出对话框,他可以在其中选中框。
问题是setState((上的复选框没有更新,就在我关闭弹出对话框并再次打开它之后,我可以看到我选中了它们。
我在弹出对话框中设置了state((,这不好吗?我似乎不知道问题出在哪里。
这是代码:
编辑:更新代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class AlwaysDisabledFocusNode extends FocusNode {
@override
bool get hasFocus => false;
}
class MultiLanguagePopupProduct extends StatefulWidget {
@override
_MultiLanguagePopupProductState createState() =>
_MultiLanguagePopupProductState();
}
class _MultiLanguagePopupProductState extends State<MultiLanguagePopupProduct> {
int selectedIndex = -1;
String text = '';
@override
Widget build(BuildContext context) {
return StatefulBuilder(
builder: (context, setState) {
return Container(
child: TextField(
focusNode: AlwaysDisabledFocusNode(),
enableInteractiveSelection: false,
decoration: InputDecoration(
suffixIcon: IconButton(
icon: Icon(FontAwesomeIcons.boxOpen),
),
labelText: 'Name and language: $text ',
labelStyle:
TextStyle(
fontWeight: FontWeight.bold, color: Colors.lightGreen),
),
onTap: () =>
showDialog(
context: context,
builder: (context) {
return AlertDialog(
scrollable: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
title: Text('Multilanguage for product'),
content: Column(
children: <Widget>[
DataTable(
onSelectAll: (val) {
setState(() {
selectedIndex = -1;
text = '';
});
},
columns: [
DataColumn(label: Text('Language')),
DataColumn(label: Text('Translation')),
],
rows: [
DataRow(
selected: 0 == selectedIndex,
onSelectChanged: (val) {
setState(() {
selectedIndex = 0;
text = 'RO';
}
);
},
cells: [
DataCell(
Text(
"RO",
textAlign: TextAlign.left,
style: TextStyle(
fontWeight: FontWeight.bold),
), onTap: () {
setState(() {
selectedIndex = 0;
text = 'RO';
print('RO is clicked');
});
}),
DataCell(
TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'paine'),
),
),
]),
DataRow(
selected: 1 == selectedIndex,
onSelectChanged: (val) {
setState(() {
selectedIndex = 1;
text = 'EN';
});
},
cells: [
DataCell(
Text(
"EN",
textAlign: TextAlign.left,
style: TextStyle(
fontWeight: FontWeight.bold),
), onTap: () {
setState(() {
selectedIndex = 1;
text = 'EN';
print('EN is clicked');
});
}),
DataCell(
TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'bread'),
),
),
]),
DataRow(
selected: 2 == selectedIndex,
onSelectChanged: (val) {
setState(() {
selectedIndex = 2;
text = 'FR';
});
},
cells: [
DataCell(
Text(
"FR",
textAlign: TextAlign.left,
style: TextStyle(
fontWeight: FontWeight.bold),
), onTap: () {
setState(() {
selectedIndex = 2;
text = 'FR';
print('FR is clicked');
});
}),
DataCell(
TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'pain'),
),
),
]),
],
),
],
),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('OK')),
FlatButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('CANCEL')),
],
);
},
),
),
);
},
);
}
}
若要仅在其中更新Widgets,请使用StatefulBuilder在Dialog 中使用setState
showDialog(
context: context,
builder: (context) {
String contentText = "Content of Dialog";
return StatefulBuilder(
builder: (context, setState) {
return AlertDialog(
title: Text("Title Text"),
content: Text(contentText),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.pop(context),
child: Text("Cancel"),
),
FlatButton(
onPressed: () {
setState(() {
contentText = "Changed Content of your Dialog";
});
},
child: Text("Change Text"),
),
],
);
},
);
},
);
StatefulBuilder是正确答案。然而,你把它放错了地方。你应该把它放在showDialog((里面,而不是放在外面。我已经用codepen实现了你的代码。看看吧。
showDialog(
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setStateForDialog) {
return AlertDialog();
}
);
}
)