【问题标题】:FlutterNativeSplash.removeAfter(initialisation) renders next screen before initialisation completesFlutterNativeSplash.removeAfter(initialisation) 在初始化完成之前渲染下一个屏幕
【发布时间】:2022-02-15 16:08:39
【问题描述】:

我正在使用 flutter_native_splash 包和 shared_preferneces 来存储我的应用数据。我的 main.dart 文件中有以下代码。

import 'package:flutter/material.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:location/location.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'home_management.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterNativeSplash.removeAfter(initialization);
  runApp(const MyApp());
}

void initialization(BuildContext context) async {
  // Initialise shared preferences
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();

  // Initialise user location and store it in shared preferences
  Location _location = Location();
  bool? _serviceEnabled;
  PermissionStatus? _permissionGranted;
  LocationData? _locationData;

  _serviceEnabled = await _location.serviceEnabled();
  if (!_serviceEnabled) {
    _serviceEnabled = await _location.requestService();
  }

  _permissionGranted = await _location.hasPermission();
  if (_permissionGranted == PermissionStatus.denied) {
    _permissionGranted = await _location.requestPermission();
  }

  _locationData = await _location.getLocation();
  sharedPreferences.setDouble('latitude', _locationData.latitude!);
  sharedPreferences.setDouble('longitude', _locationData.longitude!);
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(brightness: Brightness.light),
      darkTheme: ThemeData(brightness: Brightness.dark),
      themeMode: ThemeMode.dark,
      home: const HomeManagement(),
    );
  }
}

我正在使用 HomeManagement 通过底部导航栏管理我的页面,要加载的第一个页面是 RestaurantsMap(),如下所示。

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class RestaurantsMap extends StatefulWidget {
  const RestaurantsMap({Key? key}) : super(key: key);

  @override
  State<RestaurantsMap> createState() => _RestaurantsMapState();
}

class _RestaurantsMapState extends State<RestaurantsMap> {
  late Future<SharedPreferences> sharedPreferences;

  @override
  void initState() {
    sharedPreferences = SharedPreferences.getInstance();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Restaurants Map'),
      ),
      body: FutureBuilder(
          future: sharedPreferences,
          builder: (BuildContext context,
              AsyncSnapshot<SharedPreferences> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              print(snapshot.data!.getDouble('latitude'));

              return const Center(
                child: Text('Start building something awesome! ????????'),
              );
            } else {
              return Container();
            }
          }),
    );
  }
}

每当我在 FutureBuilder 内的 RestaurantsMap 中访问纬度时,我都会得到以下代码行打印的空值:

print(snapshot.data!.getDouble('latitude'));

sharedPreferences.setDouble 返回数据之后在initialization() 函数中使用打印语句,所以唯一合乎逻辑的解释是我在设置之前访问getDouble('latitude')。 任何观察/解决方案都会有所帮助。

【问题讨论】:

    标签: flutter async-await sharedpreferences splash-screen


    【解决方案1】:

    对于未来的观众,如果有人遇到同样的问题,只需更新到flutter_native_splash 的最新版本即可。已发布更新,可以更灵活地调用以删除启动画面。

    这是新的自述文件 - https://pub.dev/packages/flutter_native_splash#3-set-up-app-initialization-optional

    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2014-01-29
    • 2018-09-19
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多