使用共享首选项的插件时出现问题

时间:2020-04-13 09:31:54

标签: flutter sharedpreferences

我正在处理抖动,并且共享首选项插件有问题 这是我的代码:

import 'package:flutter/material.dart';
import 'package:newsapp/screens/homescreen.dart';
import 'package:newsapp/screens/onboarding.dart';
import 'package:shared_preferences/shared_preferences.dart';
void  main() async {
WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int seen1 = prefs.getInt('seen');
  Widget _screen = HomeScreen();
  if (seen1 == null || seen1 == 0)
    _screen = OnBoarding();
  else {
    _screen = HomeScreen();
  }

}
class NewsApp extends StatelessWidget {
  final Widget _screen;
  NewsApp(this._screen);
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: this._screen,
    );
  }
}

这是错误信息:

未提供首选的FlutterEngine。为此FlutterFragment创建一个新的FlutterEngine。 D / FlutterActivityAndFragmentDelegate(1817):将FlutterEngine附加到拥有此Fragment的Activity。 D / FlutterView(1817):附加到FlutterEngine:io.flutter.embedding.engine.FlutterEngine@e2b1eab

2 个答案:

答案 0 :(得分:0)

在获取

之前,我们需要添加WidgetsFlutterBinding.ensureInitialized();
await SharedPreferences.getInstance();

赞:

void  main() async {

  WidgetsFlutterBinding.ensureInitialized();

  SharedPreferences prefs = await SharedPreferences.getInstance();
  int seen1 = prefs.getInt('seen');
  Widget _screen = HomeScreen();
  if (seen1 == null || seen1 == 0)
    _screen = OnBoarding();
  else {
    _screen = HomeScreen();
  }

}

答案 1 :(得分:0)

  1. 您必须以main()结尾runApp(NewsApp());方法
  2. 将您的逻辑代码从main()方法移至NewsApp小部件。
  3. 将您的NewsApp小部件转换为StatefulWidget,以便从SharedPreferences获取数据。

像这样:

import 'package:flutter/material.dart';
import 'package:newsapp/screens/homescreen.dart';
import 'package:newsapp/screens/onboarding.dart';
import 'package:shared_preferences/shared_preferences.dart';
void  main() {
   runApp(NewsApp());
}
class NewsApp extends StatefulWidget {

  @override
  _NewsAppState createState() => _NewsAppState();
}
class _NewsAppState extends State<NewsApp> {
  final Widget _screen = HomeScreen();

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration.zero, () async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      int seen1 = prefs.getInt('seen');

      if (seen1 == null || seen1 == 0)
        _screen = OnBoarding();
      else {
        _screen = HomeScreen();
      }
      setState(() {});
    }
  }

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: this._screen,
    );
  }
}