【问题标题】:The parameter Listen : False of Provider package doesn't work ? FlutterProvider 包的参数 Listen : False 不起作用?扑
【发布时间】:2021-11-04 01:05:32
【问题描述】:

听:假 我正在尝试停止重建 LandingUser 小部件,但它不适用于 listen : false 。如果它继续重建,我将面临另一个问题,我在下面的代码中解释了它//。

LandingUser 类

class LandingUser extends StatelessWidget {
  const LandingUser({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    print("Landing User Rebuild ----------");
    final auth = Provider.of<AuthService?>(context , listen: false); // false not working
    print(auth);
    return StreamBuilder<MyUser?>(  
      stream: auth!.onChangeStateUser,
      builder: (context, snapshot) {  
        print(snapshot.hasData);    
        print(snapshot);
        if (snapshot.connectionState == ConnectionState.active) { 
          MyUser? user = snapshot.data;  
          print("user   $user");   
          if (user == null) {
            return Scaffold(body: Text('test login rebuild'),); // LogingScreen();
          } else {
            return Scaffold(body: Text('test Not null User rebuild'),); // UserProfile();
          }
        }else{
          //if(user==null){return LoginScreen();} //without if .. CircularProgressIndicator don't stop because I used in Login Screen page TextFormFeild and when foucse the widget rebuild itself and start loading again cuz the widget rebuilt .. this is another issue _!_
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        }
      
      },
    );
  }
}

根小部件主:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("Main rebulided");
    return Provider<AuthService?>.value(
      value: AuthService(),
      child: MaterialApp(
       //.......

      ),
    );
  }
}

auth!.onChangeStateUser 流获取器:

@override
  Stream<MyUser?>? get onChangeStateUser => _auth.authStateChanges().map((event) => _userFromFirebase(event));

_userFromFirebase 私有函数:

MyUser? _userFromFirebase(User? user) {
   if (user == null) {
     return null;
   }
   return MyUser(uid: user.uid);
 }

提前致谢

【问题讨论】:

    标签: firebase flutter dart flutter-provider


    【解决方案1】:
    Provider.of<AuthService?>(context , listen: false);
    

    上面的代码意味着当AuthService的值改变时,它所使用的小部件将不会重建。

    这并不意味着当StreamBuilder 中使用诸如auth!.onChangeStateUser 流之类的其他内容时,您的小部件不会被重建。

    因此,虽然 AuthService 的值没有改变,但来自 AuthService 实例的流正在改变,这就是导致重建的原因。

    【讨论】:

    • 我想我必须在从流中获得 vale 后关闭流。我像一个方法一样做到了,当连接处于活动状态时我调用它,但是如果值再次改变,流不会自行初始化。
    猜你喜欢
    • 2020-02-23
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多