如何正确使用flutter Riverpod在不同文件的widget之间共享数据?

ket*_*t-c 3 state-management dart flutter riverpod flutter-riverpod

当小部件位于同一文件中时,我能够在小部件之间共享数据,但是当小部件位于不同文件中时,用户界面不会重建,而且我似乎没有得到正确的结果。

请检查下面的代码,看看我的不足之处。(我添加了图像以便于阅读和文本代码以便于 CTRL C - CTRL V)

客观的

我正在尝试在不同文件中的多个小部件之间共享数据图片在这里

但它不会通知其他小部件/重建当点击第 45 行的按钮时,第 44 行的文本成功更改,但第 26 行的屏幕没有更改

//-------------navigation_provider.dart----------------//

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class NavigationProvider extends ChangeNotifier{

bool showUserProfile = true;
  
void toggleProfile(toggle){
showUserProfile = toggle;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)

//--------------desktop_scaffold.dart----------------//

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:premiumpeaches/providers/navigation_provider.dart';
import 'package:flutter/material.dart';

final navigatorProvider = ChangeNotifierProvider((ref) => NavigationProvider());
class DesktopScaffold extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return SizedBox(
      child: ref.watch(navigatorProvider).showUserProfile == true ? UserProfileComponent() : ProfileSettingsComponent()
    )
  
}
Run Code Online (Sandbox Code Playgroud)

//--------------user_profile_component.dart----------------//

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:premiumpeaches/providers/navigation_provider.dart';
import 'package:flutter/material.dart';

final navigatorProvider = ChangeNotifierProvider((ref) => NavigationProvider());
class UserProfileComponent extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return InkWell(
onTap:(){
ref.watch(navigatorProvider).toggleProfile(false);
},
child:Text('Click Me')
)
  
}
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 6

你定义了navigatorProvider两次。

这可能就是你的问题的根源。两个提供者意味着两种不同的状态。所以与一个人互动navigatorProvider不会对另一个人产生影响

navigatorProvider您最有可能想要导入它,而不是定义两次。

例如在里面desktop_scaffold.dart你可以这样做:

import 'user_profile_component.dart';
Run Code Online (Sandbox Code Playgroud)

然后您就可以使用navigatorProvider所有相同的。但现在,您只有一个navigatorProvider,因此所有交互都通过该一个。