#dart #flutter #flutter-dependencies
#dart #flutter #flutter-зависимости
Вопрос:
Я использую эту библиотеку для отображения пользовательских тостов в моем приложении. В моем приложении несколько страниц. Проблема в том, что toast отображается на главной странице, даже когда я вызываю showToastWidget(...)
с любых других страниц.
Главная страница
@override
Widget build(BuildContext context) {
return OKToast(
child: Scaffold(
backgroundColor: Theme.of(context).accentColor,
body: Center(
child: SizedBox(
height: 50,
width: 50,
child: Image(image: AssetImage('assets/ic_logo.png')),
),
),
),
);
}
Страница 2
@override
Widget build(BuildContext context) {
return OKToast(
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Reset Password'),
),
body: Center(
child: Padding(
padding: EdgeInsets.all(20),
child: FlatButton(
onPressed: () {
showToastWidget(
Text('Hello. I am Toast!!!'),
duration: Duration(seconds: 2),
);
},
child: Text('Show'),
),
),
),
),
);
}
Когда я вызываю showToastWidget(...)
с этой страницы, она появляется на главной странице
РЕДАКТИРОВАТЬ 1 Я получаю это исключение, когда передаю контекст в showToastWidget()
I/flutter (24327): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter (24327): The getter 'position' was called on null.
I/flutter (24327): Receiver: null
I/flutter (24327): Tried calling: position
I/flutter (24327):
I/flutter (24327): When the exception was thrown, this was the stack:
I/flutter (24327): #0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter (24327): #1 showToastWidget (package:oktoast/src/toast.dart:210:40)
Комментарии:
1. Просто из любопытства, почему вы оборачиваете каркас своей страницы виджетом OKToast?
2. Это то, что написано в их документации.
Ответ №1:
Похоже OKToast
, библиотека не поддерживает несколько OKToast
виджетов в одном приложении. Вам нужно будет обернуть все ваше приложение в OKToast
виджет, полный образец:
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return OKToast(
child: MaterialApp(
home: MainPage(),
),
);
}
}
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).accentColor,
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
FlatButton(
child: Text("Show"),
onPressed: () {
showToast(
"Main Page toast",
duration: Duration(seconds: 2),
);
},
),
SizedBox(height: 12.0),
FlatButton(
child: Text("Go to next page"),
onPressed: () => _goToNextPage(context),
),
],
),
),
);
}
void _goToNextPage(BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage(),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("Second Page"),
),
body: Center(
child: Padding(
padding: EdgeInsets.all(20),
child: FlatButton(
onPressed: () {
showToast(
"Second Page toast",
duration: Duration(seconds: 2),
);
},
child: Text('Show'),
),
),
),
);
}
}
Комментарии:
1. Я получаю исключение здесь , пожалуйста, посмотрите Мой обновленный вопрос, чтобы увидеть журнал
2. Я обновил свой ответ. Похоже, библиотека не поддерживает несколько виджетов OKToast, поэтому вам придется объединить все ваше приложение в один.
Ответ №2:
Я автор OKToast, я очень рад, что вы используете эту библиотеку.
Этот совет Toast основан на дизайне toast в Android для мобильных устройств. Вдохновение для самого OKToast исходит от toast, поэтому неизбежно, что он получил влияние, не адаптируясь к Toast на уровне отдельной страницы.
Если вам нужен компонент OKToast на уровне страницы, вам может потребоваться сделать это:
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:simple_widget/simple_widget.dart';
class CategoryPage extends StatefulWidget {
@override
_CategoryPageState createState() => _CategoryPageState();
}
class _CategoryPageState extends State<CategoryPage> {
@override
Widget build(BuildContext context) {
return OKToast(
child: SimpleScaffold(
title: "CategoryPage",
actions: <Widget>[
Builder(
builder: (ctx) => IconButton(
icon: Icon(Icons.trip_origin),
onPressed: () {
showToast("page toast", context: ctx); // use context to show toast in the page-level OKToast.
},
),
),
],
child: Container(),
),
);
}
}
Комментарии:
1. SimpleScaffold — это простая оболочка Scaffold.