【问题标题】:ChangeNotifierProvider isn't listeningChangeNotifierProvider 没有在听
【发布时间】:2021-11-14 16:21:31
【问题描述】:

我正在尝试将ChangeNotifierProvider 分享给我的main.dart,但是该值永远不会更新。 它是如何工作的

  1. main.dart 使用ChangeNotifierProvider 获取Location() 类的实例
  2. main.dart 路由到 location_login.dart 页面,其中设置了 Location() 类中的字符串。
  3. Location() 的实例应该在 main.dart 中更新,但它不会

这里是main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
    ChangeNotifierProvider<Location>.value(    <------ CREATE CHANGENOTIFIERPROVIDER
      value: Location(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Location location = Provider.of<Location>(context, listen: false);  <----- LISTEN TO PROVIDER
    return MultiProvider(
      providers: [
        FutureProvider<List<Report>>(
          create: (context) =>
              Collection<Report>(path: '${location.getLocation}/data/reports')  <----- USE PROVIDER STRING IN PATH
              .getUsers(),
          initialData: [],
        ),
      ],
      child: MaterialApp(
        routes: {
          '/': (context) => LocationLogin(),
          '/login': (context) => LoginScreen(),
          '/home': (context) => HomeScreen(),
        },

        // Theme
        theme: ThemeData(
          fontFamily: 'Nunito',
          bottomAppBarTheme: BottomAppBarTheme(
            color: Colors.black87,
          ),
          // your customizations here
          brightness: Brightness.dark,
          buttonTheme: ButtonThemeData(),
        ),
      ),
    );
  }
}

这里是location_login.dart

@override
Widget build(BuildContext context) {
Location location = Provider.of<Location>(context, listen: true);
return Scaffold(
  body: TextButton(
          child: Text("Submit",
              style: GoogleFonts.poppins(
                  fontSize: 15.sp, color: Colors.white)),
          onPressed: () {
            location.setLocation('London');              <------- SETTING LOCATION
          }),

    );
  }
}

这里是location.dart

class Location with ChangeNotifier {
  String place = 'none';

  String get getLocation => place;

  setLocation(String location) {
    place = location;
    notifyListeners();
  }
}

重申一下,问题是当我单击location_login.dart 页面中的按钮将位置设置为“伦敦”时;它不会使用包含“London”的Location() 类的新实例来更新ChangeNotifierProvider。因此,我可以更新我的FurtureProvider 中的路径。关于这里出了什么问题的任何想法?我试图尽可能清楚地说明这一点,但如果您不明白,请询问。谢谢

【问题讨论】:

    标签: flutter provider changenotifier


    【解决方案1】:

    我想你还没有消费ChangeNotifierProvider。 对我来说,下面的简单实现完美地工作。

    我的main.dart文件代码如下...

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    import 'providers/app_provider.dart';
    import 'providers/favorites_provider.dart';
    import 'providers/comments_provider.dart';
    import 'providers/home_provider.dart';
    import 'providers/details_provider.dart';
    import 'providers/gallery_provider.dart';
    import 'providers/chat_provider.dart';
    import 'ui/splash.dart';
    import 'helper/constants.dart';
    import 'ui_user/login.dart';
    
    void main() {
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => AppProvider()),
            ChangeNotifierProvider(create: (_) => GalleryProvider()),
            ChangeNotifierProvider(create: (_) => CommentsProvider()),
            ChangeNotifierProvider(create: (_) => ChatProvider()),
            ChangeNotifierProvider(create: (_) => HomeProvider()),
            ChangeNotifierProvider(create: (_) => DetailsProvider()),
            ChangeNotifierProvider(create: (_) => FavoritesProvider()),
          ],
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Consumer<AppProvider>(
          builder: (BuildContext context, AppProvider appProvider, Widget child) {
            return MaterialApp(
              key: appProvider.key,
              debugShowCheckedModeBanner: false,
              navigatorKey: appProvider.navigatorKey,
              title: Constants.appName,
              theme: appProvider.theme,
              home: appProvider.isLogin ==  "0" ? LoginPage() : Splash(),
            );
          },
        );
      }
    }
    

    我的 app_provider.dart 如下...

    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    import '../helper/constants.dart';
    
    class AppProvider extends ChangeNotifier {
      AppProvider() {
        checkTheme();
      }
      String isLogin = "0";
      ThemeData theme = Constants.lightTheme;
      Key key = UniqueKey();
      GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
    
      void setKey(value) {
        key = value;
        notifyListeners();
      }
    
      void setNavigatorKey(value) {
        navigatorKey = value;
        notifyListeners();
      }
    
      void setTheme(value, c) {
        theme = value;
        SharedPreferences.getInstance().then((prefs) {
          prefs.setString("theme", c).then((val) {
            SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
            SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
              statusBarColor:
                  c == "dark" ? Constants.darkPrimary : Constants.lightPrimary,
              statusBarIconBrightness:
                  c == "dark" ? Brightness.light : Brightness.dark,
            ));
          });
        });
        notifyListeners();
      }
    
      ThemeData getTheme(value) {
        return theme;
      }
    
      Future<ThemeData> checkTheme() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        ThemeData t;
        String r =
            prefs.getString("theme") == null ? "light" : prefs.getString("theme");
    
        isLogin = prefs.getString("isLogin") == null? "0" : prefs.getString("isLogin");
    
        if (r == "light") {
          t = Constants.lightTheme;
          setTheme(Constants.lightTheme, "light");
        } else {
          t = Constants.darkTheme;
          setTheme(Constants.darkTheme, "dark");
        }
    
        return t;
      }
    }
    

    这个解决方案对我来说效果很好。希望这对您也有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2020-08-30
      • 2019-12-11
      • 2021-12-10
      • 2020-08-22
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多