提供商未更新 class 数据

Provider doesn't update class data

P是一个class保存用户信息。

class P extends ChangeNotifier(){
    String? username;
    void upd(String str){
        userName = str;
        notifyListener();
    }
}

正在更新数据;

context.read<P>().upd("Hi");

不过,下一个代码returns只有null

context.read<P>().username;

main() 是用 MultiProvider 调用的。

runApp(MultiProvider(
    providers: [
      ListenableProvider(create: (context) => P()),
         ........

为什么 username 没有更新?

使用 context.watch<T>(),使小部件监听 T 上的变化。

正如@user18309290所说,只是补充更完整的代码。

如果你愿意,可以在 https://dartpad.dev/ 上尝试(至少按一次 FloatingActionButton。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(
  MultiProvider(
    providers: [ListenableProvider(create: (_) => P())],
    child: MyApp(),
  )
);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Test',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    Key? key,
  }) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Test'),
      ),
      body: Center(
        child: Text(context.watch<P>().userName ?? 'Null username'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          if (context.read<P>().userName != 'Teste 1') {
            context.read<P>().upd('Teste 1');
          } else {
            context.read<P>().upd('Teste 2');
          }
        },
      ),
    );
  }
}

class P extends ChangeNotifier {
    String? userName;
    void upd(String str){
        userName = str;
        notifyListeners();
    }
}