如何在第一个屏幕之前调用 sharedprefrence

How to call sharedprefrence before first screen

我正在登录屏幕上实现记住我选项,想在创建小部件之前调用共享首选项。我们有一个也是唯一的入口点,即 main function,但是我们如何在这里调用一个函数来读取原始数据 (email/password)。

void main() {
           setupLocator();
           runApp(MaterialApp(
           debugShowCheckedModeBanner: false,
           theme: new ThemeData(fontFamily: 'OpenSans-Light'),
           initialRoute: "/",
           onGenerateRoute: Router.generateRoute,
   ));
}

读取布尔值

 Future<bool> read(String key) async {
    final prefs = await SharedPreferences.getInstance();
     return prefs.getbool(key);
  }

我也尝试在路由

之前运行一个异步函数

String firstNav;
void main() {

  setupLocator();
  readSharedPref();
  if(firstNav!=null)
    runApp(MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: new ThemeData(fontFamily: 'OpenSans-Light'),
      initialRoute: firstNav,
      onGenerateRoute: Router.generateRoute,
    ));
  }

  void readSharedPref() async {
    Utiles df=Utiles();
    String isRem=await df.read("remember");
    if (isRem.contains("true")) {
      firstNav='homeview';
    } else {
      firstNav='/';
    }
}


无需在构建任何小部件之前等待 sharedPreference 加载,只需显示带有进度指示器的加载器小部件,直到加载共享首选项,并在加载时根据从 sharedPreference 加载的值显示所需的视图,这是修改代码的方法,(将 HomeView 和 RootView 小部件替换为您的 homeView 和/路由的相应小部件)

void main() {
  setupLocator();
    runApp(MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: new ThemeData(fontFamily: 'OpenSans-Light'),
      initialRoute: Loader(),
      onGenerateRoute: Router.generateRoute,
    ));

}

class Loader extends StatefulWidget {
  @override
  _LoaderState createState() => _LoaderState();
}

class _LoaderState extends State<Loader> {
  Widget firstNav;
  @override
  void initState() { 
    super.initState();
    readSharedPref();
  }
  void readSharedPref() async {
    Utiles df=Utiles();
    String isRem=await df.read("remember");
    if (isRem.contains("true")) {
      setState(() {
        // firstNav='homeview';
        firstNav=HomeView(); // replace HomeView with the widget you use for homeview route
      });
    } else {
      setState(() {
        // firstNav='/';
        firstNav=RootView(); // replace RootView with the widget you use for / route
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return firstNav != null ? firstNav : Center(child: CircularProgressIndicator(),);
  }
}

您需要将 main 函数设置为异步,并添加一个 await 和一行代码:

void main() async{
    //Add this lines is necessary now that your main is async
    WidgetsFlutterBinding.ensureInitialized();
    //Now you have to "await" the readSharedPref() function
    await readSharedPref();
    // And here comes all your code
}