Как вызвать sharedprefrence перед первым экраном - PullRequest
1 голос
/ 12 января 2020

Я использую опцию Запомнить меня на экране входа в систему, хочу вызвать общие настройки перед созданием виджета. у нас есть единственная точка входа, которая main function, но как мы можем вызвать здесь функцию для чтения примитивных данных (адрес электронной почты / пароль).

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

чтение значения bool

 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='/';
    }
}


Ответы [ 2 ]

2 голосов
/ 12 января 2020

Вам необходимо установить для main функцию asyn c и добавить 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
}
1 голос
/ 12 января 2020

Вместо ожидания ожидания загрузки sharedPreference перед созданием каких-либо виджетов, просто покажите виджет загрузчика с индикатором прогресса, пока не будет загружен общий параметр, а когда он загружен, покажите требуемое представление на основе значения, загруженного из sharedPreference, вот как вы можете изменить свой код (замените виджеты HomeView и RootView на соответствующие виджеты для homeView и / route)

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(),);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...