Flutter:Android:如何从另一个文件调用 setState()?
Flutter: Android: How to call setState() from another file?
要应用应用程序的设置配置在应用程序周围生效,我需要从应用程序设置文件触发main的setState,如何操作?
文件代码:
对于main.dart
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(
builder: (context) => Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(isVibrationEnabled
? "Vibration is enabled"
: "Vibration is disabled"),
MaterialButton(
color: Colors.grey,
child: Text("Open app setting"),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AppSettings(),
),
);
},
)
],
),
),
),
),
);
为globalVariables.dart
bool isVibrationEnabled = false;
为appSettings.dart
class _AppSettingsState extends State<AppSettings> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: FlatButton(
color: Colors.grey,
child: Text(
isVibrationEnabled ? "Disable Vibration" : "Enable Vibration"),
onPressed: () {
setState(() {
isVibrationEnabled
? isVibrationEnabled = false
: isVibrationEnabled = true;
});
//What to do here to trigger setState() in main.dart flie
//for displaying "Vibration is enabled" or "Vibration is disabled"
//acording to the value of bool variable which is in globalVariable.dart file.
},
),
),
),
);
我在 Whosebug 上看到了其他答案,但其中 none 很容易理解,如果有人可以简单地回答,请
对于您的特定用例,我认为最好是使用 Provider、BLoC 或 GetX 等状态管理解决方案。文档在这里:
https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
如果您想要快速简单的操作,您可以将正在侦听的值和包含 setState 的函数传递到新页面。通常您会使用子小部件而不是新页面来执行此操作,因此它可能会变得有点复杂——您需要在 setState 之后重建整个页面。我能想到的最简单的方法是 Navigator.pushReplacement.
一些代码(我在 Whosebug 中写的而不是我的 IDE 所以可能有错误):
class AppSettings extends StatefulWidget {
final Function callback;
final bool isVibrationEnabled;
AppSettings({
@required this.callback,
@required this.isVibrationEnabled,
});
}
...
在您的 AppSettingsState 中使用:
FlatButton(
color: Colors.grey,
child: Text(
widget.isVibrationEnabled ? "Disable Vibration" : "Enable Vibration"),
onPressed: () => widget.callback(),
),
并且在您的主文件中,在创建您的应用程序设置时使用如下内容:
MaterialButton(
color: Colors.grey,
child: Text("Open app setting"),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AppSettings(
isVibrationEnabled: isVibrationEnabled,
callback: callback,
),
),
);
},
)
void Function callback() {
setState(() => isVibrationEnabled = !isVibrationEnabled);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => AppSettings(
isVibrationEnabled: isVibrationEnabled,
callback: callback,
),
),
);
}
同样,对于这个特定用例,您可能应该使用状态管理解决方案。从另一个页面重建一个页面看起来很乱。但它应该工作。
是的,您在回调中使用了回调。因此,您可能需要将回调放在文件顶部附近,或放在主函数之外,以使其正常工作。
要应用应用程序的设置配置在应用程序周围生效,我需要从应用程序设置文件触发main的setState,如何操作?
文件代码:
对于main.dart
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(
builder: (context) => Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(isVibrationEnabled
? "Vibration is enabled"
: "Vibration is disabled"),
MaterialButton(
color: Colors.grey,
child: Text("Open app setting"),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AppSettings(),
),
);
},
)
],
),
),
),
),
);
为globalVariables.dart
bool isVibrationEnabled = false;
为appSettings.dart
class _AppSettingsState extends State<AppSettings> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: FlatButton(
color: Colors.grey,
child: Text(
isVibrationEnabled ? "Disable Vibration" : "Enable Vibration"),
onPressed: () {
setState(() {
isVibrationEnabled
? isVibrationEnabled = false
: isVibrationEnabled = true;
});
//What to do here to trigger setState() in main.dart flie
//for displaying "Vibration is enabled" or "Vibration is disabled"
//acording to the value of bool variable which is in globalVariable.dart file.
},
),
),
),
);
我在 Whosebug 上看到了其他答案,但其中 none 很容易理解,如果有人可以简单地回答,请
对于您的特定用例,我认为最好是使用 Provider、BLoC 或 GetX 等状态管理解决方案。文档在这里: https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
如果您想要快速简单的操作,您可以将正在侦听的值和包含 setState 的函数传递到新页面。通常您会使用子小部件而不是新页面来执行此操作,因此它可能会变得有点复杂——您需要在 setState 之后重建整个页面。我能想到的最简单的方法是 Navigator.pushReplacement.
一些代码(我在 Whosebug 中写的而不是我的 IDE 所以可能有错误):
class AppSettings extends StatefulWidget {
final Function callback;
final bool isVibrationEnabled;
AppSettings({
@required this.callback,
@required this.isVibrationEnabled,
});
}
...
在您的 AppSettingsState 中使用:
FlatButton(
color: Colors.grey,
child: Text(
widget.isVibrationEnabled ? "Disable Vibration" : "Enable Vibration"),
onPressed: () => widget.callback(),
),
并且在您的主文件中,在创建您的应用程序设置时使用如下内容:
MaterialButton(
color: Colors.grey,
child: Text("Open app setting"),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AppSettings(
isVibrationEnabled: isVibrationEnabled,
callback: callback,
),
),
);
},
)
void Function callback() {
setState(() => isVibrationEnabled = !isVibrationEnabled);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => AppSettings(
isVibrationEnabled: isVibrationEnabled,
callback: callback,
),
),
);
}
同样,对于这个特定用例,您可能应该使用状态管理解决方案。从另一个页面重建一个页面看起来很乱。但它应该工作。 是的,您在回调中使用了回调。因此,您可能需要将回调放在文件顶部附近,或放在主函数之外,以使其正常工作。