#flutter #dart
Вопрос:
У меня есть следующий блок кода, в котором я получаю версию приложения с помощью библиотеки, а затем передаю версию приложения в ящик. Этот ящик я отправляю на следующий экран, но когда я открываю ящик на следующем экране, приложение отображается как НУЛЕВОЕ. В чем может быть проблема ? Я приведу ниже полный исходный код, и, возможно, кто-нибудь сможет помочь мне выяснить, где ошибка.
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';
void main() {
runApp(FirstPage());
}
class FirstPage extends StatefulWidget {
final String title;
FirstPage({Key key, this.title}) : super(key: key);
@override
_FirstPageState createState() => _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
String packageAppVersion = '';
@override
void initState() {
super.initState();
versionCheck();
}
Future<void> versionCheck() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
setState(() {
packageAppVersion = packageInfo.version;
});
}
Widget buildDrawerForSecondPage(BuildContext context) {
return new Drawer(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: new Column(
children: [
Flexible(
child: new ListView(
children: <Widget>[],
),
),
Flexible(
flex: 0,
child: Text("App version: $packageAppVersion"),
)
],
),
),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Drawer Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SecondPage(
title: 'Second Page',
drawer: buildDrawerForSecondPage(context),
),
);
}
}
class SecondPage extends StatefulWidget {
final String title;
final Drawer drawer;
SecondPage({Key key, this.title, this.drawer}) : super(key: key);
@override
_SecondPageState createState() => _SecondPageState(drawer);
}
class _SecondPageState extends State<SecondPage> {
String packageAppVersion = '';
final Drawer drawer;
_SecondPageState(this.drawer);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
endDrawer: drawer,
body: Container(),
);
}
}
Заранее спасибо.
Ответ №1:
Это потому, что вы используете .then()
синтаксис, на самом AppVersion
деле он обновляется, но немного позже, отсюда null
и значение. Вы могли await
бы использовать версию до run()
метода , а затем передать ее дальше MaterialApp
, или вы могли бы попробовать использовать a setState
после печати внутри then()
. Дайте мне знать, если это исправит вашу проблему.
Ответ №2:
Изначально значение packageAppVersion
равно нулю, именно это отображается в пользовательском интерфейсе. Поэтому для обновления пользовательского интерфейса вам нужно использовать setState
. Проверьте приведенный ниже код для лучшего понимания:
@override
void initState() {
super.initState();
versionCheck();
}
Future<void> versionCheck() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
setState((){
packageAppVersion = packageInfo.version;
});
print('App version received: $packageAppVersion');
}
Комментарии:
1. Я не показываю версию приложения на первом экране. Я отображаю его на втором экране ( страница входа в систему).
Ответ №3:
Я нашел исправление для приведенного выше кода, но я не понимаю, почему работает только так (удалено drawer
свойство и конструктор из _SecondPageState
) :
class SecondPage extends StatefulWidget {
final String title;
final Drawer drawer;
SecondPage({Key key, this.title, this.drawer}) : super(key: key);
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
String packageAppVersion = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
endDrawer: widget.drawer,
body: Container(),
);
}
}