【问题标题】:how to change the state inside FutureBuilder如何更改 FutureBuilder 中的状态
【发布时间】:2021-07-16 09:49:37
【问题描述】:

我只需要当用户打开屏幕时通知图标按钮在他点击时发生变化,它的价值来自共享偏好。问题是图标永远不会改变! initState 代码:

  @override
  void initState() { 
    super.initState();
    _isActiveNotification = _notificationGetState();
   
  }

_notificationGetState 函数是:

  //getting notification on/off
  Future<bool> _notificationGetState() async {
    final SharedPreferences _prefs = await SharedPreferences.getInstance();

    return _prefs.getBool('notification') ?? true;
  }

_isActiveNotification 变量是:

late Future<bool> _isActiveNotification;

通知图标按钮的类为:

class _NoificationActivationButton extends StatefulWidget {
  _NoificationActivationButton();
  @override
  _NoificationActivationButtonState createState() =>
      _NoificationActivationButtonState();
}
    
    
   class _NoificationActivationButtonState
            extends State<_NoificationActivationButton> {
          @override
          Widget build(BuildContext context) {
            return FutureBuilder<bool>(
                //function haveing the return value
                future: _isActiveNotification,
                builder: (context, snapshot) {
                  bool data = snapshot.data!;
                  return IconButton(
                    icon: Icon(
                      data
                          ? Icons.notifications_active_outlined
                          : Icons.notifications_off_outlined,
                      color: Colors.white,
                      size: 40,
                    ),
                    onPressed: () {
                      setState(() {
                         data = !data;
                       });
                    },
                  );
                });
          }

【问题讨论】:

  • data 设为_NoificationActivationButtonState 类的全局变量,并将其赋值给return data = _prefs.getBool('notification') ?? true;。不要忘记删除bool data = snapshot.data!;
  • 同样的问题!
  • 你确定?可以更新代码吗?
  • 我正在使用 FutureBuilder 来避免您的解决方案,因为 FutureBuilder 采用未来变量根据未来值构建小部件。如果您尝试了代码,您就会明白我在说什么。 @rickimaru
  • 其实也一样。如果你想在FutureBuilder中设置data,看我的回答(_isOtherVersion = true)。

标签: flutter dart flutter-futurebuilder


【解决方案1】:

只需调用 setstate

onPressed: () {
 data = !data;

// just call setstate((){});
},

【讨论】:

    【解决方案2】:

    data 设为全局状态。

    注意:我只是假设您只会调用一次 _notificationGetState(在 initState 中)。

    样品...

    class _NoificationActivationButtonState
        extends State<_NoificationActivationButton> {
      final bool _isOtherVersion = true;
    
      late Future<bool> _isActiveNotification;
    
      bool? _data;
    
      @override
      void initState() {
        super.initState();
        _isActiveNotification = _notificationGetState();
      }
    
      //getting notification on/off
      Future<bool> _notificationGetState() async {
        final SharedPreferences _prefs = await SharedPreferences.getInstance();
        return _isOtherVersion
            ? _prefs.getBool('notification') ?? true
            : _data = _prefs.getBool('notification') ?? true;
      }
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder<bool>(
          //function haveing the return value
          future: _isActiveNotification,
          builder: (context, snapshot) {
            if (snapshot.connectionState != ConnectionState.done) {
              return const CircularProgressIndicator();
            }
    
            if (_isOtherVersion && _data == null) {
              _data = snapshot.data;
            }
    
            return IconButton(
              icon: Icon(
                _data!
                    ? Icons.notifications_active_outlined
                    : Icons.notifications_off_outlined,
                color: Colors.white,
                size: 40,
              ),
              onPressed: () => setState(() => _data = !_data!),
            );
          },
        );
      }
    }
    

    【讨论】:

    • 非常感谢!我在下面创建了另一个解决方案。我希望你看到它,听到你的意见:) @rickimaru
    • @someone 不错。我认为您可以在setState 中删除snapshot.data != snapshot.data;
    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2020-11-16
    • 2019-10-07
    • 2021-07-14
    • 2020-12-12
    • 1970-01-01
    • 2021-11-09
    • 2020-12-10
    相关资源
    最近更新 更多