Flutter从供应商处获取值

rks48beu  于 2022-12-05  发布在  Flutter
关注(0)|答案(4)|浏览(196)

我正在使用提供程序作为状态管理。为了在多个文件之间使用值,我创建了一个如下的提供程序

class globalProvider with ChangeNotifier, DiagnosticableTreeMixin {
  String uuID = "";

  String get _uuID => uuID;

  void changeuuID(id) {
    uuID = id;
    notifyListeners();
  }

}

我正在更新值,如下所示

final uuidUpdate = Provider.of<globalProvider>(context, listen: false);
   uuidUpdate.changeuuID(user.uid);

现在在另一个页面我需要打印uuID值。我尝试这样做

print(Provider.of<globalProvider>(context).uuID);

但它显示错误尝试从小部件树外部监听提供程序公开的值。
main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => globalProvider()),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: LoginPage(),
      ),
    ),
  );
}
sg2wtvxw

sg2wtvxw1#

您需要在小部件树中添加状态,如:

ChangeNotifierProvider(
        create: (context) => globalProvider (),
        builder: (context, _) {
    return theRestOfTheTreeWidgets();}
    )
inkz8wg9

inkz8wg92#

在main.dart中添加ChangeNotifierProvider.值(值:全局提供程序),
确保你的类以大写字母开头,并让我知道箭头是否还存在。

hgqdbh6s

hgqdbh6s3#

您需要使用listen: false将其打印出来,如下所示:

print(Provider.of<globalProvider>(context, listen: false).uuID);
utugiqy6

utugiqy64#

您可以使用此软件包
获取_它:^7.2.0

class GlobalProvider with ChangeNotifier, DiagnosticableTreeMixin {
  String _uuID = "";

  String get uuID => _uuID;

  void changeuuID(id) {
    _uuID = id;
    notifyListeners();
  }

}

请务必使用Upper cast并将以下代码粘贴到main.dart中

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
 await di.init();
  runApp(
    MultiProvider(
      providers: [
          ChangeNotifierProvider(create: (context) => di.sl<GlobalProvider >()),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: LoginPage(),
      ),
    ),
  );
}

创建一个新dart文件并粘贴以下代码

final sl = GetIt.instance;

Future<void> init() async {
    sl.registerFactory(() => GlobalProvider ());
}

而且我已经在主文件中使用了这个init()函数..只需导入库

相关问题