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,
                     ),
                  ),
                );
              }

同样,对于这个特定用例,您可能应该使用状态管理解决方案。从另一个页面重建一个页面看起来很乱。但它应该工作。 是的,您在回调中使用了回调。因此,您可能需要将回调放在文件顶部附近,或放在主函数之外,以使其正常工作。