Плавающая навигация по дочерним элементам MaterialApp

#flutter #dart

#трепетание #дротик

Вопрос:

Я довольно новичок в flutter и dart, я настроил свое приложение следующим образом:

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

  @override
  State<MyExpensesApp> createState() => _MyExpensesAppState();
}

class _MyExpensesAppState extends State<MyExpensesApp> {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'title',
      home: Directionality(
        textDirection: TextDirection.rtl,
        child: HomePage(),
      ),
    );
  }
}
 

и у меня есть кнопка FloatingAction внутри HomePage , которая при нажатии переходит на другую страницу

   @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        ....
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => ExpensePage()))
        },
        tooltip: "add expense",
        child: Icon(Icons.add),
      ),
    );
  }
}
 

но при навигации по ExpensePage экрану это не RTL, что означает, что он не является дочерним элементом виджета Directionality?
Я просто заменяю все MaterialApp на ExpensePage ?
Как я могу заменить дочерний элемент Directionality только при навигации?
Мне не нужна какая-либо сложная маршрутизация, поскольку у меня есть только эти 2 страницы.

Ответ №1:

Чтобы разместить виджет направленности над навигатором (и, следовательно, над каждой страницей), вы можете использовать builder свойство в MaterialApp .

     return MaterialApp(
      title: 'title',
      home: HomePage(),
      builder: (context, child) => Directionality(
          textDirection: TextDirection.rtl,
          child: child!,
      ),
    );
 

Комментарии:

1. Спасибо, это сработало! что делает восклицательный знак в child! ?

2. @Dimon child имеет значение null, но поскольку вы предоставили home виджет, этот дочерний элемент будет (ненулевым) навигатором. Восклицательный знак указывает Dart, который child не равен null, поэтому его можно передать в качестве child параметра конструктора виджета Directionality.

Ответ №2:

Для дочерней страницы вы можете использовать Scaffold в качестве корневого родительского элемента. Затем попробуйте использовать ту же маршрутизацию.

Комментарии:

1. Метод сборки дочерней страницы «Домашняя страница» возвращает каркас .. то же самое для «ExpensePage».

2. Приложение material должно быть только на начальной странице. А для остального экрана вы можете использовать его в качестве родительского или корневого виджета