OpenFlutter / flutter_oktoast отображается только на главной странице?

#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.