0

我正在尝试将 a 分享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”ChangeNotifierProvider的类的新实例来更新。Location()因此,我无法更新FurtureProvider. 关于这里出了什么问题的任何想法?我试图尽可能清楚地说明这一点,但如果您不明白,请询问。谢谢

4

1 回答 1

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;
  }
}

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

于 2021-09-22T04:58:58.680 回答