我正在try 为我的Ffltter应用程序设置自动路由.这很简单,我还没有添加很多页面.然而,在我制作的页面中,TextFormField不起作用.每当我点击输入栏时,屏幕都会闪烁(可能是小部件重建),键盘会显示一小段时间,然后什么都不会发生.如果我try 在一个页面上执行相同的操作,而不是使用初始:True路由,我会被导航到初始页面.我确认这与自动路由有关,因为如果我将其从应用程序中删除,字段将开始正常工作.我还在页面上添加了按钮,以便在页面之间导航.它们工作正常.

main.dart

void main() async {
  await ScreenUtil.ensureScreenSize();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    ScreenUtil.init(context, designSize: const Size(AppConstants.appWidth, AppConstants.appHeight));
    final _appRouter = AppRouter();
    return MaterialApp.router(
      routerConfig: _appRouter.config(),
      debugShowCheckedModeBanner: false,
      title: 'Book AI',
      theme: AppTheme.darkTheme(),
      themeMode: ThemeMode.system,
      //home: const TestingScreen()
    );
  }
}

router.dart:

import 'package:auto_route/auto_route.dart';
import 'package:book_ai/presentation/pages/route_test.dart';
import 'package:book_ai/presentation/pages/test.dart';
// import 'package:book_ai/presentation/router/router.dart';


part 'router.gr.dart';  

@AutoRouterConfig()
class AppRouter extends _$AppRouter {
  @override
  List<AutoRoute> get routes => [
    AutoRoute(page: TestingRoute.page, initial: true),
    AutoRoute(page: RoutingTestRoute.page)

  ];
}

包含我创建的输入字段的Test.dart:

@RoutePage()
class TestingScreen extends StatefulWidget {
  const TestingScreen({super.key});
  @override
  State<TestingScreen> createState() => _TestScreenState();
}

class _TestScreenState extends State<TestingScreen> {
  final TextEditingController textController = TextEditingController();
  final TextEditingController testController = TextEditingController();
  @override
  Widget build(BuildContext context) {
    ScreenUtil.init(context, designSize: const Size(AppConstants.appWidth, AppConstants.appHeight));

    return Scaffold(
      resizeToAvoidBottomInset: true,
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Theme.of(context).focusColor,
        title: const Text('Testing page'),
      ),
      body: Container(
        decoration:const BoxDecoration(
          image: DecorationImage(
            image: AssetImage('assets/images/bg-dark.png'), // Replace with your image path
            fit: BoxFit.cover,
          ),
        ),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              FilterButton(text: "hello", active: false, onPressed: () {  }),
              // FilterButton(text: "hello", active: false, onPressed: () { }),
              PrimaryButton(text: "hello", onPressed: () { context.router.push(const RoutingTestRoute());}),
              SearchInput(controller: textController, hintText: 'Search for something'),
              TextFormField(controller: testController,  decoration: InputDecoration(
                      hintText: 'this is a test',
                      border: InputBorder.none,
                      hintStyle: Theme.of(context).textTheme.titleMedium
                    ),)
            ],
          ),
        ),
      ),
    );
  }
}

我的定制输入小工具,以防有人需要查看.我认为它没有问题,因为即使是一个普通的TextFormField窗口小部件也不能工作:

class SearchInput extends StatefulWidget {
  final TextEditingController controller;
  final String hintText;
  final VoidCallback? onSearchPressed;

  SearchInput({
    required this.controller,
    required this.hintText,
    this.onSearchPressed,
  });

  @override
  State<SearchInput> createState() => _SearchInputState();
}

class _SearchInputState extends State<SearchInput> {
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(6.w),
        color: Theme.of(context).disabledColor, // Adjust the flopacity as needed
      ),
      child: ClipRRect(
        borderRadius: BorderRadius.circular(6.w),
        child: BackdropFilter(
          filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
          child: Row(
            children: [
              Expanded(
                child: Padding(
                  padding: EdgeInsets.symmetric(horizontal: 16.w),
                  child: Form(
                    child: TextFormField(
                      controller: widget.controller,
                      decoration: InputDecoration(
                        hintText: widget.hintText,
                        border: InputBorder.none,
                        hintStyle: Theme.of(context).textTheme.titleMedium
                      ),
                    ),
                  ),
                ),
              ),
              IconButton(
                icon: const Icon(Icons.search),
                onPressed: widget.onSearchPressed,
                color: Theme.of(context).primaryColor, // fix issue that it shows as gray
                
              ),
            ],
          ),
        ),
      ),
    );
  }
}


我try 在输入周围添加一个Form小部件,向每个输入传递一个键,但都不起作用.

推荐答案

不要在build方法内部启动AppRouter.

从AUTO_ROUTE的readme开始:

运行生成器后,将生成您的路由类,并将其与MaterialApp挂钩.

// assuming this is the root widget of your App                 
class App extends StatelessWidget {            
  // make sure you don't initiate your router                
  // inside of the build function.                
  final _appRouter = AppRouter();            
            
  @override            
  Widget build(BuildContext context){            
    return MaterialApp.router(            
      routerConfig: _appRouter.config(),         
    );            
  }            
}

Flutter相关问答推荐

如何在列表磁贴上添加行

使用Flutter 提供程序包加载状态应用程序时,在自定义按钮中显示CircularProgressIndicator

创建后检索FiRestore文档ID

MobX Build_Runner问题:不生成.G文件(Flutter )

在创建肘部并使用冻结时,无法使用中的Copy With方法

Android上火焰瓷砖之间的线条飘动

带有图标抖动的自定义下拉按钮

Flutter卡内容未在水平列表视图中居中

无法应用插件com.chaquo.python

如何修改来自合并 list 的 Android list 权限?

如何动态获取任何小部件的像素?

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

如何使Flutter 屏幕无法关闭?

如何计算 Firestore 集合中的文档数量?

Flutter ListView 在 Column 中工作但在 Row 中不工作

java.lang.IncompatibleClassChangeError:找到接口 com.google.android.gms.location.SettingsClient,

如何在向下滚动时隐藏顶部卡片并在向上滚动时出现?

我想在一个屏幕上有两个相同区域的列表视图,我该如何设置?

Flutter Websockets MacOS:相同的代码在调试模式下有效,但在发布模式下无效:(操作系统错误:提供了 node 名或服务名..)

更改文本字段Flutter 中最大字母的 colored颜色