【问题标题】:Flutter Riverpod/Provider: Setting an initial state for a stateNotifierFlutter Riverpod/Provider:为 stateNotifier 设置初始状态
【发布时间】:2021-03-17 22:46:33
【问题描述】:

所以我想要一个提供者,其初始状态将是用户的位置,这就是我现在拥有的,对吗?

import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/all.dart';
import 'package:location/location.dart';

class MapApiState {
  final LocationData userLocation;
  MapApiState({@required this.userLocation});
}

class MapNotifier extends StateNotifier<MapApiState> {
  static Location _location = Location();

  MapNotifier() : super(null) {
    _location.getLocation().then((initialState) =>
        super.state = MapApiState(userLocation: initialState));
  }
}

这是正确的方法吗?我现在如何为此声明全局提供程序变量? super(null) 让我担心。但我不能只放“super(_location.getLocation())”

另外,我应该如何实例化我的全局提供程序变量?

【问题讨论】:

    标签: flutter dart flutter-provider riverpod


    【解决方案1】:

    这几乎取决于您希望如何在应用的生命周期中应用它,您可以使用 StreamProviderFutureProvider 获取位置,然后将其传递给您的 StateNotifier

    final locationProvider = FutureProvider<LocationData>((ref) {
      final Location _location = Location();
    
      return _location.getLocation();
    });
    
    final singleDetailDealProvider = StateNotifierProvider<MapNotifier>((ref) {
      final location = ref.watch(locationProvider);
      return MapNotifier(location.data?.value);
    });
    
    class MapNotifier extends StateNotifier<MapApiState> {
      MapNotifier(LocationData location) : super(location);
    }
    

    这样,如果您想在其他地方使用该位置,您可以调用 locationProvider 而不依赖于 MapNotifier 的状态

    【讨论】:

    • 如果不将 Location() 服务放在自己的提供程序中,我怎么能做到这一点?你的代码的第二部分看起来像我想要使用的东西
    • 在一个提供者中合并所有的问题是 getLocation 是一个 Future 而 MapNotifier 是一个 StateNotifierProvider,如果你使用 ..getLocation 作为你的例子它会工作,但它可以让你的应用程序垃圾,因为它会同步运行代码
    • 非常感谢您的解释!这是有道理的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2021-04-04
    • 2022-09-27
    • 2020-11-02
    • 2023-02-07
    • 2020-12-02
    相关资源
    最近更新 更多