Flutter中的Provider在应用程序的第一次构建时未返回

weylhg0b  于 2023-05-23  发布在  Flutter
关注(0)|答案(1)|浏览(265)

Flutter中的Provider在App的第一次构建时不返回。在我的应用程序中,您可以选择应用程序的主要颜色。因此,当我将其设置为颜色2(int表示颜色)时,我使用共享首选项保存它,并使用provider在每个页面和小部件中使用它。很简单!但在应用程序的第一次构建时,它并没有获取颜色。图片更好地理解:
当应用程序启动时:App
使用导航栏时:App
希望你能理解使用图片的问题。有人可以帮助它获取颜色立即在应用程序的第一个构建。这是用于切换颜色的提供程序:

class ColorProvider with ChangeNotifier {
  int _selectedColor = 0;
  Color _mainColor = Colors.blue;

  ColorProvider() {
    _getColor();
  }

  int get selectedColor => _selectedColor;

  set selectedColor(int index) {
    _selectedColor = index;
    _saveColor();
    notifyListeners();
  }

  Color get mainColor => _mainColor;

  Future<void> _saveColor() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('_selectedColorKey', _selectedColor);
  }

  Future<void> _getColor() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final savedSelectedColor = prefs.getInt('_selectedColorKey');
    if (savedSelectedColor != null) {
      _selectedColor = savedSelectedColor;
    }
  }

// This code can be used in another widget the 
// provider and prefs only saves an int so with this you can choose (this isn't too important)
  _getMainClr(int no) {
    switch (no) {
      case 0:
        _mainColor = blueClr;
        return blueClr;
      case 1:
        _mainColor = tifBlueClr;
        return tifBlueClr;
      case 2:
        _mainColor = yellowClr;
        return yellowClr;
      default:
        _mainColor = blueClr;
        return blueClr;
    }
  }
}
}

我试图实现这段代码,以便它可以在开始时获取getPrefs,但上面的color Provider已经基本做到了这一点,但这段代码值得一试。

@override
  void initState() {
    super.initState();
    getPrefs();
  }

  Future<void> getPrefs() async {
    //Get the int selected Color
    setState(() {});
  }
zphenhs4

zphenhs41#

您遇到的问题是由于从SharedPreferences获取数据的异步性质。为了解决这个问题,您可以在ColorProvider中创建一个名为init()的方法,并像这样调用它:

class ColorProvider with ChangeNotifier {
  int _selectedColor = 0;
  Color _mainColor = Colors.blue;
  bool _isInitialized = false;

  int get selectedColor => _selectedColor;

  set selectedColor(int index) {
    _selectedColor = index;
    _saveColor();
    notifyListeners();
  }

  Color get mainColor => _mainColor;

  Future<void> init() async {
    await _getColor();
    _isInitialized = true;
    notifyListeners();
  }

  Future<void> _saveColor() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('_selectedColorKey', _selectedColor);
  }

  Future<void> _getColor() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final savedSelectedColor = prefs.getInt('_selectedColorKey');
    if (savedSelectedColor != null) {
      _selectedColor = savedSelectedColor;
    }
  }

  // the rest of your code
}

然后像这样调用init()

@override
void initState() {
  super.initState();
  Provider.of<ColorProvider>(context,listen:false).init();
}

快乐编码...

相关问题