众所周知,setState是异步的。我已经阅读了关于setState的几个问题,关于如何在setState之后立即使用值,但是这些不是我现在所需要的。
我试图为数组List设置值,然后使用该List做一个函数来获取Result的值。如果setState不异步,则将是这样
`
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_statusfragment,container,false);
imageView = view.findViewById(R.id.imageView);
button = (Button)view.findViewById(R.id.button2);
textView = view.findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(),"Upload screenshot",Toast.LENGTH_LONG).show();
if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
requestPermissions(
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
2000);
}else {
Toast.makeText(getActivity(), "Choose Screenshot", Toast.LENGTH_LONG).show();
imageView.setVisibility(View.VISIBLE);
button.setVisibility(View.VISIBLE);
textView.setVisibility(View.VISIBLE);
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
startActivityForResult(intent,1000);
}
}
}
});
// Inflate the layout for this fragment
return view;
}
`
反正有实现这一目标的方法吗?研究用的文档或关键字非常棒。 非常感谢
答案 0 :(得分:1)
setState有一个回调参数,状态更新后将调用
this.setState({
list: resultList,
result: this.doSomething(resultList)
}, () => {
//do something with the updated this.state
});
答案 1 :(得分:0)
您可以像使用异步等待
Solution
- App_Code
- EmployeeDS.cs
- BLL
- DAL
- InventarioCiclicoDB.edmx
答案 2 :(得分:0)
不建议将this.state
与this.setState
一起使用,这完全是因为状态更新是异步的,并且可能导致竞争状态。
如果更新的状态是从先前的状态派生的,则应使用state updater function。因为它是异步的,所以由于合成事件在React中的工作方式,应事先处理事件对象:
const { id, value } = e.target;
this.setState(state => {
const list = [...state.list];
list[id] = value;
return {
list,
result: this.doSomething(list)
};
});