Flutter Flatter Riverpod/Provider:设置stateNotifier的初始状态

Flutter Flatter Riverpod/Provider:设置stateNotifier的初始状态,flutter,dart,flutter-provider,riverpod,Flutter,Dart,Flutter Provider,Riverpod,所以我想有一个提供者,它的初始状态是用户的位置,这就是我现在拥有的,对吗 import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/all.dart'; import 'package:location/location.dart'; class MapApiState { final LocationData userLocation; MapApiState({@required this.

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

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));
  }
}
导入“包:flift/foundation.dart”;
进口“包装:颤振_riverpod/all.dart”;
导入“package:location/location.dart”;
类映射状态{
最终位置数据用户位置;
MapApiState({@required this.userLocation});
}
类MapNotifier扩展了StateNotifier{
静态位置_位置=位置();
MapNotifier():超级(空){
_location.getLocation()然后((initialState)=>
super.state=MapApiState(userLocation:initialState));
}
}
这是正确的方法吗?我现在如何声明此的全局提供程序变量?超级(空)让我担心。但我不能只放“super(_location.getLocation())”


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

这几乎取决于你想如何在你的应用程序的生命周期中应用它,你可以使用
StreamProvider
FutureProvider
获取位置,然后将它传递给你的
状态通知程序

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);
}
final locationProvider=FutureProvider((参考){
最终位置_位置=位置();
返回_location.getLocation();
});
最终singleDetailDealProvider=StateNotifierProvider((ref){
最终位置=参考手表(位置提供商);
返回MapNotifier(location.data?.value);
});
类MapNotifier扩展了StateNotifier{
MapNotifier(LocationData位置):超级(位置);
}

这样,如果您想在其他地方使用该位置,您可以调用locationProvider,而无需依赖MapNotifier的状态。这几乎取决于您希望如何在应用程序的生命周期中应用它,您可以使用
StreamProvider
FutureProvider
获取位置,然后将其传递给您的
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);
}
final locationProvider=FutureProvider((参考){
最终位置_位置=位置();
返回_location.getLocation();
});
最终singleDetailDealProvider=StateNotifierProvider((ref){
最终位置=参考手表(位置提供商);
返回MapNotifier(location.data?.value);
});
类MapNotifier扩展了StateNotifier{
MapNotifier(LocationData位置):超级(位置);
}

这样,如果您想在其他地方使用location,您可以调用locationProvider,而无需依赖MapNotifier的状态

如何在不将location()服务放在其自己的提供程序中的情况下执行此操作?代码的第二部分看起来像我想使用的东西在单个提供程序中合并所有内容的问题是getLocation是未来的,MapNotifier是StateNotifierProvider,如果不使用未来的提供程序,就无法等待未来,如果您使用..getLocation作为示例,它会起作用,但会使您的应用程序成为垃圾,因为它会同步运行代码。非常感谢您的解释!这是有道理的我怎么能不把Location()服务放在它自己的提供者中呢?代码的第二部分看起来像我想使用的东西在单个提供程序中合并所有内容的问题是getLocation是未来的,MapNotifier是StateNotifierProvider,如果不使用未来的提供程序,就无法等待未来,如果您使用..getLocation作为示例,它会起作用,但会使您的应用程序成为垃圾,因为它会同步运行代码。非常感谢您的解释!这是有道理的