假设我有一个想要更新的状态:
state = {
description: "",
notes: ""
}
Run Code Online (Sandbox Code Playgroud)
如果我不需要使用 prevState,只用一个对象更新状态,有什么区别吗?
this.setState({description: "Blue"});
Run Code Online (Sandbox Code Playgroud)
与
this.setState((prevState)=> ({description: "Blue"}));
Run Code Online (Sandbox Code Playgroud) 我正在使用 Formik 来验证一些数据。当它应该创建新实体时它工作正常,但是当我想编辑实体时就会出现问题。
编辑模式必须从状态激活(this.state.edit === true),实体的数据也存储在状态上,例如 this.state.name 那里有一个字符串值。
我在渲染中放置了控制台日志,问题是日志被打印了几次,第一次在 this.sate.name 上使用空字符串,并且 this.state.edit 的值为 false。接下来打印它是正确的,此编辑为 true 并且名称包含一个值。
这是代码:
import React from 'react';
import { Redirect } from 'react-router-dom';
import { Formik, Form, Field } from 'formik';
import { Input, Button, Label, Grid } from 'semantic-ui-react';
import { connect } from 'react-redux';
import * as Yup from 'yup';
import { Creators } from '../../../actions';
class CreateCompanyForm extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
name: '',
redirectCreate: false,
redirectEdit: false,
edit: …Run Code Online (Sandbox Code Playgroud) 我想在用户在文本字段上输入至少一个字符时更改按钮的颜色\n还想在文本字段为空时更改颜色
\n所以我尝试标记(布尔值)来实现它
\nonChanged: (value) {\n if (value.length == 0) {\n setState(() {\n _isTimeFilled = false;\n });\n } else {\n setState(() {\n _isTimeFilled = true;\n });\n }\n},\n\n...\n\n_isFilled ? Colors.grey : Colors.green\n\nRun Code Online (Sandbox Code Playgroud)\n但它只会在文本字段未聚焦时改变颜色
\n我也尝试过提供商,但结果是一样的。\n我该如何解决这个问题?
\n这是我的代码
\n void _changeButtonColor(int value) {\xe2\x9c\x85\xe2\x9c\x85\xe2\x9c\x85\xe2\x9c\x85\n if (value == 0) {\n setState(() => _isTimeFilled = false);\n } else {\n setState(() => _isTimeFilled = true);\n }\n }\n \n TextFormField TimeTextFormField() {\n return TextFormField(\n focusNode: timeFocusNode,\n autofocus: true,\n keyboardType: TextInputType.number,\n textInputAction: TextInputAction.next,\n onChanged: (value) {\n …Run Code Online (Sandbox Code Playgroud) 我正在制作一个页面,其中包含一些相互交互的保管箱和一个 Futurebuilder 包装的 ListView。
当 Dropbox 发生更改并单击复选框时,我会调用“setState”。但是,由于checkbox的onChanged中的setState,Futurebuilder不断被调用,ListView被重建。因此,当单击复选框时,整个列表视图都会闪烁,如下视频所示。
我想保留列表视图并仅更新复选框。有人可以帮助我吗?谢谢。
完整的代码是
class _StatefulDialogWidgetState extends State<StatefulDialogWidget> {
....
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Dropdown's
Dropdown(0, widget.ReceiveArgs, _lListOfDepthList),
Dropdown(1, widget.ReceiveArgs, _lListOfDepthList),
Dropdown(2, widget.ReceiveArgs, _lListOfDepthList),
Dropdown(3, widget.ReceiveArgs, _lListOfDepthList),
Dropdown(4, widget.ReceiveArgs, _lListOfDepthList),
// Listview with FutureBuilder
AptListview(),
],
);
}
Run Code Online (Sandbox Code Playgroud)
列表视图代码
Widget AptListview() {
return FutureBuilder<List<String>>(
future: AptNameListView(widget.ReceiveArgs),
builder: (context, snapshot) {
if (_bLastDepth == false) {
return Text("Select Address");
} else {
if (snapshot.hasData == false || snapshot.data.isEmpty …Run Code Online (Sandbox Code Playgroud) 我已经根据数据库中的条目创建了自定义小部件的 ListView.builder。现在我正在尝试添加删除功能。当我单击该按钮时,该条目就会相应地从数据库中删除。但是,尽管调用了 setState(),ListView 也不会更新。我怀疑这可能是由于删除方法是异步的,如何让应用程序先删除条目,然后刷新 ListView?
\n我的 ListView.builder 的代码是:
\nListView.builder(\n padding: const EdgeInsets.all(8.0),\n itemExtent: 106.0,\n itemCount: snapshot.data.length,\n itemBuilder: (context, index) {\n return CustomListItem(\n name: transactionsReversed[index].name,\n category: transactionsReversed[index].category,\n sign: transactionsReversed[index].sign,\n amount: transactionsReversed[index].amount,\n id: transactionsReversed[index].id,\n delete: (){\n print('Running delete function on ${transactionsReversed[index].id}');\n setState(() {\n _remove(transactionsReversed[index].id);\n });\n }\n );\n }\n),\nRun Code Online (Sandbox Code Playgroud)\n自定义列表项如下所示:
\nclass CustomListItem extends StatelessWidget {\n const CustomListItem({\n this.name, this.category, this.sign, this.amount, this.id, this.delete\n });\n\n final String name;\n final String category;\n final String sign;\n final double amount;\n final int id;\n …Run Code Online (Sandbox Code Playgroud) 我是 Flutter/Dart 开发的新手,但我遇到了这个问题,即调用 setState 不会重建小部件。
我试图在用户界面中显示用户在点击它们时选择的流派以及将它们添加到另一个列表中。点击的选择的颜色应该会改变,但重新打开模式时没有任何变化,但流派实际上已添加到另一个列表中。
这是代码
class GenresPicker extends StatefulWidget {
@override
_GenresPickerState createState() => _GenresPickerState();
}
class _GenresPickerState extends State<GenresPicker> {
List<Genre> _selectedGenres = [];
@override
void initState() {
super.initState();
}
addGenre(genre) {
setState(() {
_selectedGenres.add(genre);
});
}
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
padding: EdgeInsets.all(20),
child: FutureBuilder<List<Genre>>(
future: fetchGenres(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"MODAL BOTTOM SHEET EXAMPLE",
style: TextStyle(
fontStyle: …Run Code Online (Sandbox Code Playgroud) 在我的代码中使用有状态小部件和setstate以及showdialog和Alertdialog似乎无法正常工作,但为了简化起见,我在这里用更小更简单的代码模拟了同样的问题,以便更好地理解问题
import 'package:flutter/material.dart';
import '../widgets/app_drawer.dart';
class Test extends StatefulWidget {
@override
State<Test> createState() => _TestState();
}
class _TestState extends State<Test> {
int x = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: AppDrawer(),
appBar: AppBar(
title: Text("Shop"),
),
body: Column(
children: [
RaisedButton(
onPressed: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text("hey"),
content: Text(x.toString()),
actions: [
RaisedButton(
onPressed: () {},
child: Text("click me"),
),
RaisedButton(
onPressed: () { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 api 调用后更新变量,但我将使用点击事件来解决这个问题。
如您所见,我打印的变量在第一次单击时使用旧状态,因为它尚未注册更改。在以下调用中,变量将打印新文本。
有没有办法在changeText函数中立即使用更新后的变量?
https://stackblitz.com/edit/react-36jqi3
export default function App() {
const [text, setText] = useState('inital text');
const changeText = () => {
setText('new text');
console.log(text);
};
return (
<div>
<button onClick={changeText}>Update variable</button>
</div>
);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习颤振,但是他已经妨碍了我一个多星期,无法使setState正常工作。
在这种情况下,我想按一个按钮并更改其图标和属性,基本上有另一个元素,但是我无法使其正常工作。
这是我的小部件代码:
import 'package:flutter/material.dart';
class UserButton extends StatefulWidget {
@override
_UserButtonState createState() => _UserButtonState();
}
class _UserButtonState extends State<UserButton> {
@override
Widget build(BuildContext context) {
bool loggedin = false;
return Container(
child: loggedin
? IconButton(
onPressed: () {
setState(() {
loggedin = false;
});
},
icon: Icon(Icons.person),
)
: IconButton(
onPressed: () {
setState(() {
loggedin = true;
});
},
icon: Icon(Icons.person_outline),
tooltip: "Login",
));
}
}
Run Code Online (Sandbox Code Playgroud)
这是主要的应用代码:
import 'package:flutter/material.dart';
import 'package:orar/user_button.dart';
main(List<String> args) {
runApp(Home());
}
class Home …Run Code Online (Sandbox Code Playgroud) 这是我反应原生的第一天,我正在使用mangodb,我在db中存储记录并获取记录,现在我想在flatlist中显示,并且需要setState()但是它会抛出undefined的错误
db.find({}, function (err, docs) {
this.setState({ dataSource: docs });
});
Run Code Online (Sandbox Code Playgroud)
docs是用户数组,我能够在控制台中打印数据,它的工作原理,但问题是我如何使用setState在数据源中设置这些数据.
setstate ×10
flutter ×6
dart ×5
reactjs ×4
javascript ×3
checkbox ×1
formik ×1
listview ×1
react-native ×1
showdialog ×1
state ×1
textfield ×1
variables ×1
yup ×1