我如何使用 Flutter Riverpod 更改 bool 变量

Nad*_*een 5 dart flutter riverpod

我是新来的Flutter Riverpod management

我使用 stfl 小部件Flutter Riverpod management,我需要将 test bool 变量更改为 true 但无法处理它

final testProvider = StateProvider<bool>((ref) => false);

`class FriendsList extends ConsumerStatefulWidget {


  const FriendsList({Key? key}) : super(key: key);

  @override
  _FriendsListState createState() => _FriendsListState();



}

class _FriendsListState extends ConsumerState<FriendsList> {







 @override
 Widget build(BuildContext context) {
 bool test = ref.watch(testProvider);
        return Stack( //edit
    children [
    !test ? Text('bool varible is false')
                         :  Text('bool varible is true')
     FutureBuilder(
           future: FirebaseFirestore.instance.collection('users')
                      .doc('userId').get(),
            builder: (context, AsyncSnapshot snapshot) {
               if(!snapshot.hasData){
                     return Text('');
                  }else{ 
                    
                        ref.read(testProvider.state).state = true;
                   }  
               return snapshot.data['name'];
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个问题。我也不确定我的代码是否正确,以及如果需要如何处理它

Jos*_*eve 3

a 中的值Provider无法从 外部更改Provider。使用 aStateProvider代替。

看一下这个:

final testProvider = StateProvider<bool>((ref) => false);

class FriendList extends ConsumerStatefulWidget {
  const FriendList({Key? key}) : super(key: key);

  @override
  ConsumerState<ConsumerStatefulWidget> createState() => _FriendListState();
}

class _FriendListState extends ConsumerState<FriendList> {
  @override
  Widget build(BuildContext context) {
    bool test = ref.watch(testProvider);
    return IconButton(
      onPressed: () {
        ref.read(testProvider.notifier).state = true;
      },
      icon: Text(
        test ? "Variable updated" : "Still not updated",
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

请访问Riverpod 文档以了解更多信息。

编辑:我已经使用Provider和编写了一个完整的示例StateNotifierProvider

与 Firebase 通信的服务

class UserService {
  static Future<Map> getUser() async {
    DocumentSnapshot<Map> s = await FirebaseFirestore.instance
        .collection('users')
        .doc('userId')
        .get();
    return Map.from(s.data()!);
  }
}
Run Code Online (Sandbox Code Playgroud)

A StateNotifierProvider、与StateNotifier服务通信:

final userProvider = StateNotifierProvider<UserNotifier, AsyncValue<Map>>((ref) => UserNotifier());

class UserNotifier extends StateNotifier<AsyncValue<Map>> {
  UserNotifier() : super(AsyncLoading()) {
    get();
  }

  void get() async {
    state = AsyncData(await UserService.getUser());
  }
}
Run Code Online (Sandbox Code Playgroud)

AtestProvider

final testProvider = Provider<bool>((ref) {
  AsyncValue test = ref.watch(userProvider);
  return test is AsyncData;
});
Run Code Online (Sandbox Code Playgroud)

以及Providers消耗

class FriendList extends ConsumerWidget {
  const FriendList({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    AsyncValue value = ref.read(userProvider);
    bool test = ref.read(testProvider);
    return Column(
      children: [
        Text(test ? "bool varialbe is true" : "bool varialbe is false"),
        value.when(
          loading: () => Text('Loading...'),
          data: (data) => Text('${data['name']}'),
          error: (error, __) => Text('Error: $error'),
        ),
      ],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)