#flutter
Вопрос:
**main.dart**
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import './widgets/transaction_list.dart';
import './widgets/new_transaction.dart';
import './widgets/chart.dart';
import './models/transaction.dart';
void main() {
// WidgetsFlutterBinding.ensureInitialized();
// SystemChrome.setPreferredOrientations([
// DeviceOrientation.portraitUp,
// DeviceOrientation.portraitDown,
// ]);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Personal Expenses',
home: MyHomePage(),
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.purple,
accentColor: Colors.amber,
fontFamily: "Quicksand",
textTheme: ThemeData.light().textTheme.copyWith(
headline6: TextStyle(
fontFamily: "OpenSans",
fontWeight: FontWeight.bold,
fontSize: 18,
),
button: TextStyle(color: Colors.white),
),
appBarTheme: AppBarTheme(
titleTextStyle: TextStyle(
fontFamily: "OpenSans",
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
// late String titleInput;
// late String amountInput;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<Transaction> _userTransactions = [];
List<Transaction> get _recentTransaction {
return _userTransactions.where((tx) {
return tx.date.isAfter(
DateTime.now().subtract(
Duration(days: 7),
),
);
}).toList();
}
bool _showChart = false;
void _addNewTransaction(
String txTitle, double txAmount, DateTime chosenDate) {
final newTx = Transaction(
title: txTitle,
amount: txAmount,
id: DateTime.now().toString(),
date: chosenDate,
);
setState(() {
_userTransactions.add(newTx);
});
}
void _startAddNewTransaction(BuildContext ctx) {
showModalBottomSheet(
context: ctx,
builder: (_) {
return GestureDetector(
onTap: () {},
child: NewTransaction(_addNewTransaction),
behavior: HitTestBehavior.opaque,
);
},
);
}
void _deleteTransaction(String id) {
setState(() {
_userTransactions.removeWhere((tx) {
return tx.id == id;
});
});
}
@override
Widget build(BuildContext context) {
final mediaQuery = MediaQuery.of(context);
final isLandScape = mediaQuery.orientation == Orientation.landscape;
final PreferredSizeWidget appBar = Platform.isIOS
? CupertinoNavigationBar(
middle: Text(
"Personal Expenses",
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
child: Icon(CupertinoIcons.add),
onTap: () => _startAddNewTransaction(context),
)
],
),
)
: AppBar(
title: Text(
'Personal Expenses',
),
actions: <Widget>[
IconButton(
onPressed: () => _startAddNewTransaction(context),
icon: Icon(Icons.add),
)
],
);
final txListWidget = Container(
height: (mediaQuery.size.height -
appBar.preferredSize.height -
mediaQuery.padding.top) *
0.7,
child: TransactionList(_userTransactions, _deleteTransaction),
);
final pageBody = SingleChildScrollView(
child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
if (isLandScape)
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Show chart"),
Switch.adaptive(
activeColor: Theme.of(context).accentColor,
value: _showChart,
onChanged: (value) {
setState(() {
_showChart = value;
});
},
),
],
),
if (!isLandScape)
Container(
height: (mediaQuery.size.height -
appBar.preferredSize.height -
mediaQuery.padding.top) *
0.3,
child: Chart(_recentTransaction),
),
if (!isLandScape) txListWidget,
if (isLandScape)
_showChart
? Container(
height: (mediaQuery.size.height -
appBar.preferredSize.height -
mediaQuery.padding.top) *
0.7,
child: Chart(_recentTransaction),
)
: txListWidget,
],
),
);
return Platform.isIOS
? CupertinoPageScaffold(
child: pageBody,
navigationBar: appBar,
)
: Scaffold(
appBar: appBar,
body: pageBody,
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
floatingActionButton: Platform.isIOS
? Container()
: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () => _startAddNewTransaction(context),
),
);
}
}
Пока я использовал последнюю панель приложений PreferredSizeWidget = Platforn.isISO ? Панель навигации купертинонавигации() : Панель приложений();
это показывает мне ошибку в этом, а также в CupertinoPageScaffold(дочерний элемент: (), панель навигации: панель приложений).
Ошибка показывает мне в коде следующее: значение типа «Виджет» не может быть присвоено переменной типа «PreferredSizeWidget». Попробуйте изменить тип переменной или присвоить правому типу значение «PreferredSizeWidget».
Как я могу устранить эту ошибку ?
Ответ №1:
Я рекомендую вам создать отдельный виджет AppbarTop для себя. Основа для этого находится в приведенном ниже фрагменте, добавьте свою собственную логику и назначьте это appBar
свойству вашего Scaffold
.
import 'package:flutter/material.dart';
class AppbarTop extends StatelessWidget implements PreferredSizeWidget {
const AppbarTop();
@override
Widget build(BuildContext context) {
return Platform.isIOS ? CupertinoNavigationBar() : AppBar();
}
@override
Size get preferredSize => Size.fromHeight(AppBar().preferredSize.height);
}